Bean的声明周期接口
InitializingBean.afterPropertiesSet()
这个方法将在所有的属性被初始化后调用。这个时声明的针对具体bean的。
DisposableBean.destroy()
这个方法将在bean在销毁时调用,这个声明时针对具体类的。
以上这两个接口窃以为都是为不习惯在配置文件中写init-method和destroy-method的人提供。
BeanPostProcessor
BeanPostProcessor是Spring中定义的一个接口,其与之前介绍的InitializingBean和DisposableBean接口类似,也是供Spring进行回调的。里面包含postProcessBeforeInitialization和postProcessAfterInitialization。所有bean都会经过这些方法。
InstantiationAwareBeanPostProcessor
是上面接口的子接口。postProcessBeforeInstantiation将在具体bean进入构造函数之前执行,而postProcessPropertyValues将在bean结束构造函数执行。和他的父接口不同,这个接口的实现类不需要手工绑定。
总结如下:
建立时:
postProcessBeforeInitialization(所有) -> InitializingBean.afterPropertiesSet(单个) -> init-method(单个) -> postProcessAfterInitialization(所有)
销毁时
DisposableBean.destroy -> destroy-method
Spring声明周期接口
Spring的启动
context = new ClassPathXmlApplicationContext(new String[]{
"applicationContext.xml"
类似这样的代码是无法启动Spring的!!这样写的化Spring的启动发生在你第一次getbean。当然,你可以手动调用
context.start()
Spring启动的第一件事就是加载配置文件。
实例化并执行BeanDefinitionRegistryPostProcessor
如果一个bean实现了这个接口,在所有bean完成定义注册时,spring将调用这个方法一次。在这个方法里,你可以手动新增bean。这也意味着BeanDefinitionRegistryPostProcessor的实现bean将被在这个步骤之前完成了实例化。
实例化并执行BeanFactoryPostProcessor
在bean实例化之前执行的。也就是说,Spring允许BeanFactoryPostProcessor在容器创建bean之前读取bean配置元数据,并可进行修改。这也意味着BeanFactoryPostProcessor的实现bean将被在这个步骤之前完成了实例化。
实例化InstantiationAwareBeanPostProcessor。
此时,spring已经完成准备工作。将抛出ContextRefreshedEvent事件。
以上两者的总结如下图
另外一张很有用的图为