bean创建—初始化—销毁的过程
容器管理bean的生命周期
可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候,来调用自定义的初始化和销毁方法
构造{对象创建}
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象
BeanPostProcessor.postProcessBeforeInitialization
初始化:
单实例:对象创建完成,并赋值好,调用初始化方法
多实例:在每次获取的时候创建对象,并赋值好,调用初始化方法
BeanPostProcessor.postProcessAfterInitialization
销毁
单实例:容器关闭时调用销毁方法,列如:applicationContext.close()
多实例:容器不会管理多实例的bean,用户自己管理
BeanPostProcessor原理分析populateBean(beanName, mbd, instanceWrapper); // 给bean进行属性赋值
initializeBean(beanName, exposedObject, mbd); // 初始化bean
{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
{
//遍历得到容器中所有的BeanPostProcessor:
//挨个执行,一旦返回null,后面的就不再执行后面的BeanPostProcessor
}
invokeAwareMethods(beanName, bean);// 执行初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
{
//遍历得到容器中所有的BeanPostProcessor:
//挨个执行,一旦返回null,后面的就不再执行后面的BeanPostProcessor
}
}
初始化和销毁方法配置方式
-
指定初始化和销毁方法
—xml方式
指定int-method="", destory-method=""
—注解方式
@Bean(intMethod="", destoryMethod="")
-
通过让Bean实现InitializingBean(定义初始化方法)
通过让Bean实现DisposableBean(定义销毁逻辑)
-
可以使用JSR250定义的注解:
@PostConstruct:对象创建完成,并赋值之后调用
@PreDestroy:在容器销毁容器前,执行销毁工作
-
BeanPostProcessor【interface】:bean的后置处理器
在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:创建对象之后,自定义初始化之前
postProcessAfterInitialization:自定义初始化之后调用
# 调用顺序输出 Construct: class nuts.sample.xml.bean.MyClass # 构造器方法 postProcessBeforeInitialization: myClass # 构造器方法之后,后续初始化方法之前 @PostConstruct # 用于需要在依赖注入完成后执行任何初始化的方法。 afterPropertiesSet # 在设置所有 bean 属性并满足BeanFactoryAware , ApplicationContextAware等之后,由包含BeanFactory调用。此方法允许 bean 实例在设置所有 bean 属性后执行其整体配置和最终初始化的验证。 @Bean(initMethod = ) # 初始化方法 postProcessAfterInitialization: myClass # 初始化之后调用 getBeanDefinitionNames: org.springframework.context.annotation.internalConfigurationAnnotationProcessor getBeanDefinitionNames: org.springframework.context.annotation.internalAutowiredAnnotationProcessor getBeanDefinitionNames: org.springframework.context.annotation.internalCommonAnnotationProcessor getBeanDefinitionNames: org.springframework.context.event.internalEventListenerProcessor getBeanDefinitionNames: org.springframework.context.event.internalEventListenerFactory getBeanDefinitionNames: beanConfig getBeanDefinitionNames: myBeanPostProcessor getBeanDefinitionNames: person getBeanDefinitionNames: myClass getBean: nuts.sample.xml.bean.MyClass@4534d395 # 获取bean实例对象 @PreDestroy # 在销毁方法前调用 DisposableBean # 在销毁 bean 时由包含BeanFactory调用。 @Bean(destroyMethod = ) # 销毁方法Spring低层对BeanPostProcessor的使用
bean的赋值,注入其他组件,@AutoWired,生命周期注解功能,@Async等 都是依赖于BeanPostProcessor实现



