spring中bean生命周期

Posted programmlover

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring中bean生命周期相关的知识,希望对你有一定的参考价值。

一  bean指定初始化和销毁方法

1、bean的生命周期:bean的创建 ---> 初始化 ---> 销毁的过程

   bean的生命周期有容器来管理

   单例的bean在创建时执行初始化方法,在spring关闭时执行销毁方法

   原型的bean在每次获取时执行初始化方法,没有销毁方法

   我们可以自己指定初始化和销毁方法,要指定的方法必须是bean所属的类的方法。注意:这个方法必须是个无参的方法

2、创建实体类

public class Car {
    
    private String name;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public  Car() {
        
    }
    
    public  Car(String name) {
        this.name = name;
    }
    
    public void init() {
        System.out.println("car init");
    }
    
    public void destroy() {
        System.out.println("car destroy");
    }

}

3、创建bean

    @Bean(initMethod="init",destroyMethod="destroy")
    public Car getCar() {
        return new Car("car");
    }

4、创建测试方法

    public static void main(String[] args) {
        ApplicationContext application = new AnnotationConfigApplicationContext(MainConfig.class);        
        ((AnnotationConfigApplicationContext)application).close();
    }

这样就能看到后台先打印初始化方法,执行 ((AnnotationConfigApplicationContext)application).close()后打印销毁方法

 

二  InitializingBean和DisposableBean创建初始化和销毁方法

1、bean所属的类实现 InitializingBean和DisposableBean并重写他们的方法就可以创建初始化和销毁方法

2、示例

public class Dog implements InitializingBean,DisposableBean{
    
    private String name;
    
    public void setName(String name) {
        this.name = name;
    }

    public  Dog() {
        
    }
    
    public  Dog(String name) {
        this.name = name;
    }
    
    /* 初始化方法 */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("dog init");
    }
    
    /* 销毁方法 */
    @Override
    public void destroy() {
        System.out.println("dog destroy");
    }

}

 

三  使用 @PostConstruct和@PreDestroy 创建初始化和销毁方法

1、示例

public class Mouse {
    
    private String name;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public  Mouse(String name) {
        this.name = name;
    }
    
    @PostConstruct
    public void init() {
        System.out.println("mouse init");
    }
    
    @PreDestroy
    public void destroy() {
        System.out.println("mouse destroy");
    }

}

 

四 BeanPostProcessor的应用

1、BeanPostProcessor 是一个接口,实现了 BeanPostProcessor 的类在注册为bean时作为一个AOP拦截bean的初始化方法

2、BeanPostProcessor 中的方法:

  Object postProcessBeforeInitialization(Object bean, String beanName)  //初始化方法执行之前拦截执行的方法

  Object postProcessAfterInitialization(Object bean, String beanName)   //初始化方法return之前拦截执行的方法。

3、示例

@Component
public class MyBeanPostProcessor implements BeanPostProcessor{

    /**
     * 初始化方法执行之前拦截的方法
     * 
     * Object: 创建的bean
     * beanName: bean的id
     * @return 返回bean的原始实例或包装的实例,返回为null将会报错
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);
        return bean;
    }

    /**
     * 初始化方法return之前拦截的方法
     * 
     * Object: 创建的bean
     * beanName: bean的id
     * @return 返回bean的原始实例或包装的实例,返回为null将会报错
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);
        return bean;
    }

}

 

五  BeanPostProcessor的原理:

AbstractAutowireCapableBeanFactory.doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args){  //从这一步开始进入创建bean的方法
  ...

  populateBean(beanName, mbd, instanceWrapper);  //给bean进行属性赋值
  initializeBean(beanName, exposedObject, mbd){  //进入初始化bean方法
    applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);  //执行初始化方法执行之前拦截的方法

    invokeInitMethods(beanName, wrappedBean, mbd);  //执行自定义初始化方法
    applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);  //执行初始化方法return之前拦截的方法

  }

  ...

}

 

六  BeanPostProcessor在spring底层的使用:

1、spring中的所有注解的具体工作实现都是有BeanPostProcessor家族的类来完成的,比如:

  AutowiredAnnotationBeanPostProcessor  //处理所有@Autowired注解完成自动注入

  

 


以上是关于spring中bean生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Spring应用上下文中Bean的生命周期

Spring课程 Spring入门篇 3-2 Spring bean装配(上)之bean的生命周期

spring中bean的生命周期是怎么样的

Spring事务,Bean生命周期

深究Spring中Bean的生命周期

spring生成bean对象的生命周期都有哪些种类?