Spring学习笔记之bean生命周期

网友投稿 297 2023-03-06


Spring学习笔记之bean生命周期

前言

上一篇文章主要学习了下bean的配置、注入、自定义属性编辑器,今天来熟悉bean的生命周期。

任何一个事物都有自己的生命周期,生命的开始、生命中、生命结束。大家最熟悉的应该是servlet 的生命周期吧。和 servlet 一样 spring bean 也有自己的生命周期。

在开发中生命周期是一个很常见的名词,基本每种编程语言都能找到与它关联的。关于bean的生命周期我在网上也找了好多,基本都差不多。这里我主要是想通过代码来验证,毕竟学的知识都是一样的,都是学的java,最重要的是动手练习,这样印象更深。

下面是它生命周期的描述,我们通过demo来进行验证。

下图是它执行的顺序。

一、创建LiftCycle类实现BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean,ApplicationContextAware5个接口方法

package Cuiyw.Spring.Service;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.BeanFactoryAware;

import org.springframework.beans.factory.BeanNameAware;

import org.springframework.beans.factory.DisposableBean;

import org.springframework.beans.factory.InitializingBean;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

public class LifeCycle implements BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean,ApplicationContextAware{

private String name;

public String getName() {

System.out.println("getName name="+name);

return name;

}

public void setName(String name) {

System.out.println("setName name="+name);

this.name = name;

}

public void afterPropertiesSet() throws Exception {

// TODO Auto-generated method stub

System.out.println("InitializingBean.afterPropertiesSet()");

}

public void setBeanName(String arg0) {

// TODO Auto-generated method stub

System.out.println("BeanNameAware.setBeanName");

}

public void setBeanFactory(BeanFactory arg0) throws BeansException {

// TODO Auto-generated method stub

System.out.println("BeanFactoryAware.setBeanFactory");

}

public void destroy() throws Exception {

// TODO Auto-generated method stub

System.out.println("DisposableBean.destroy");

}

public void myInit() {

System.out.println("【init-method】调用的init-method属性指定的初始化方法");

}

public void myDestory() {

System.out.println("【destroy-method】调用的destroy-method属性指定的初始化方法");

}

public void setApplicationContext(ApplicationContext arg0) throws BeansException {

// TODO Auto-generated method stub

System.out.println("ApplicationContextAware.setApplicationContext");

}

}

二、注册InstantiationAwareBeanPostProcessor接口

package Cuiyw.Spring.Service;

import java.beans.PropertyDescriptor;

import org.springframework.beans.BeansException;

import org.springframework.beans.PropertyValues;

import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;

public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor{

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

// TODO Auto-generated method stub

System.out.println("InstantiationAwareBeanPostProcessor.postProcessAfterInitialization");

return bean;

}

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

// TODO Auto-generated method stub

System.out.println("InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization");

return bean;

}

public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {

// TODO Auto-generated method stub

System.out.println("InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation");

return true;

}

public Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException {

// TODO Auto-generated method stub

System.out.println("InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation");

return null;

}

public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,

String beanName) throws BeansException {

// TODO Auto-generated method stub

System.out.println("InstantiationAwareBeanPostProcessor.postProcessPropertyValues");

return pvs;

}

}

三、注册BeanPostProcessor接口

其实InstantiationAwareBeanPostProcessor继承BeanPostProcessor,所以在上面我也实现了BeanPostProcessor接口的方法

package Cuiyw.Spring.Service;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

// TODO Auto-generated method stub

System.out.println("BeanPostProcessor.postProcessAfterInitialization ");

return bean;

}

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

// TODO Auto-generated method stub

System.out.println("BeanPostProcessor.postProcessBeforeInitialization");

return bean;

}

}

四、注册BeanFactoryPostProcessor接口

package Cuiyw.Spring.Service;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.config.BeanFactoryPostProcessor;

import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {

// TODO Auto-generated method stub

System.out.println("BeanFactoryPostProcessor.postProcessBeanFactory");

}

}

五、在上下文中配置

这里还是在上一个博客demo的基础上进行修改,为了有其他干扰,我先把service去掉了。

xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd">

xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd">

六、在main中使用bean

package Cuiyw.SpringAop;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import Cuiyw.Spring.IService.IService;

import Cuiyw.Spring.Service.LifeCycle;

public class App

{

public static void main( String[] args )

{

ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"ApplicationContext.xml"});

BeanFactory factory=context;

LifeCycle lifeCycle=factory.getBean("lifeCycle",LifeCycle.class);

lifeCycle.setName("cuiyw2");

System.out.println("lifeCycle.name="+lifeCycle.getfcvUpjfName());

((ClassPathXmlApplicationContext)factory).registerShutdownHook();

/*service=(IService)factory.getBean("ServiceA");

service.service("Cuiyw ServiceA");

service=(IService)factory.getBean("ServiceImpl");

service.service("Cuiyw ServiceImpl"); */

}

}

七、输入打印结果

可以发现输出的顺序和上面图的顺序基本一致。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详细介绍idea如何设置类头注释和方法注释(图文)
下一篇:运维管理标准api(运维标准指南)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~