• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

【Spring注解】生命周期

互联网 diligentman 3个月前 (12-17) 29次浏览

Spring注解 生命周期

    • 初始化和销毁调用时机
  • 自定义初始化和销毁的方式
    • @Bean指定初始化和销毁方法
    • initializingBean和DisposableBean接口
    • @PostConstruct 和@PreDestroy
  • BeanPostProcessor 后置处理器
    • BeanPostProcessor原理
    • Spring底层对BeanPostProcessor的使用
  1. bean的生命周期:bean创建–>初始化–>销毁的过程
  2. 在Spring中由容器管理bean的生命周期,我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期的是或来调用我们自己定义的初始化和销毁方法

初始化和销毁调用时机

生命周期:

  • 构造(对象创建)
    单实例:在容器启动的时候创建
    多实例:在每次获取的时候创建
  • BeanPostProcessor.postProcessBeforeInitialization
  • 初始化
    对象创建完成并赋值好,调用初始化方法
  • BeanPostProcessor.postProcessAfterInitialization
  • 销毁
    单实例:容器关闭的时候
    多实例:容器不会管理这个bean,容器不会调用销毁方法

【Spring注解】生命周期

  1. 自定义初始化和销毁方法的方式:
    • @Bean指定初始化和销毁方法
    • 实现initializingBean和DisposableBean接口
    • @PostConstruct 和@PreDestroy
    • BeanPostProcessor 后置处理器
      在初始化前后

自定义初始化和销毁的方式

@Bean指定初始化和销毁方法

第一种方式是通过@Bean指定初始化和销毁方法

@Bean(initMethod = "init",destroyMethod = "destroy")

@Bean 有两个属性:

  • initMethod = “init” 指定初始化方法名为init(在要创建的类中的方法)
  • destroyMethod = “destroy” 指定销毁方法名为destroy

这两个属性就等价于xml里Bean标签的init-method属性和destroy-method属性
【Spring注解】生命周期
【Spring注解】生命周期

单实例情况的输出:
【Spring注解】生命周期

initializingBean和DisposableBean接口

我们可以通过让Bean实现initializingBean接口定义初始化,的afterPropertiesSet()方法会在bean创建完成并属性赋值好后调用
让Bean实现DisposableBean接口定义销毁,DisposableBean接口的destroy()方法会在容器关闭的时候调用
【Spring注解】生命周期

@PostConstruct 和@PreDestroy

JSR250规范定义了两个注解:
这两个注解都是标在方法上的

  • @PostConstruct 在bean创建完成并且属性赋值完成,来执行初始化方法
  • @PreDestroy 在容器销毁bean之前 会调用这个注解标注的方法
    【Spring注解】生命周期

BeanPostProcessor 后置处理器

在bean初始化前后进行一些处理工作

  • postProcessBeforeInitialization在bean创建后但初始化之前(例如initializingBean的afterPropertiesSet方法调用、initMethod指定的方法调用)
  • postProcessAfterInitialization bean初始化之后调用

这两个方法的参数

  • bean就是容器中已经创建的对象(返回也返回这个对象)
  • beanName就是对象的名字
    【Spring注解】生命周期

BeanPostProcessor原理

populateBean()//1. 给属性赋值
{
   
    
//2. 后置处理器 调用PostProcessorsBeforeInitialization()方法	
applyBeanPostProcessorsBeforeInitialization 

//3. 调用自定义初始化方法
invokeInitMethods
//4. 后置处理器 调用PostProcessorsAfterInitialization()方法
applyBeanPostProcessorsAfterInitialization
}
  1. 在doCreateBean方法中
    我们可以看到是先调populateBean()方法对bean的属性进行赋值,然后再调用initializeBean()方法

    【Spring注解】生命周期

  2. initializeBean()方法中

    【Spring注解】生命周期

  3. applyBeanPostProcessorsBeforeInitialization()方法

这个方法就是把所有的后置处理器都拿出来,然后调用每个的postProcessBeforeInitialization方法,如果有一个为null,就返回(后面的后置处理器就不调用了)
【Spring注解】生命周期

Spring底层对BeanPostProcessor的使用

{{o.name}}


{{m.name}}


程序员灯塔
转载请注明原文链接:【Spring注解】生命周期
喜欢 (0)