1. bean生命周期流程图
2. 涉及接口
InstantiationAwareBeanPostProcessor接口
instantiation 实例化前后执行
InstantiationAwareBeanPostProcessor接口是BeanPostProcessor的子接口,通过接口字面意思翻译该接口的作用是感知Bean实例化的处理器。
方法 | 描述 |
postProcessBeforeInitialization | BeanPostProcessor接口中的方法, 在Bean的自定义初始化方法之前执行 |
postProcessAfterInitialization | BeanPostProcessor接口中的方法 在Bean的自定义初始化方法执行完成之后执行 |
postProcessBeforeInstantiation | 自身方法,是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走 |
postProcessAfterInstantiation | 在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。因为它的返回值是决定要不要调用postProcessPropertyValues方法的其中一个因素(因为还有一个因素是mbd.getDependencyCheck());如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行;如果返回true,postProcessPropertyValues就会被执行 |
postProcessPropertyValues | 对属性值进行修改,如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改 |
postProcessBeforeInstantiation方法如果不返回null,将跳过初始化过程
BeanPostProcessor接口
initialization 初始化
该接口我们也叫后置处理器,作用是在Bean对象在实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。注意是Bean实例化完毕后及依赖注入完成后触发的
方法 | 说明 |
postProcessBeforeInitialization | 实例化、依赖注入完毕, 在调用显示的初始化之前完成一些定制的初始化任务 |
postProcessAfterInitialization | 实例化、依赖注入、初始化完毕时执行 |
Aware
Aware类型的接口的作用就是让我们能够拿到Spring容器中的一些资源,所有的Aware方法都是在初始化阶段之前调用的
- BeanNameAware
- BeanClassLoaderAware
- BeanFactoryAware
- EnvironmentAware
- mbeddedValueResolverAware
- ApplicationContextAware 其返回都是当前的ApplicationContext对象
BeanFactoryPostProcessor
beanFactory后置处理器, beanFactory初始化后执行
加载所有bean之前,修改应用程序上下文的内部bean工厂里面所有beandefinitions(未实例化)
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor子类,在BeanFactoryPostProcessor之前执行
1. void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
对现有beanDefinition做一些改变。
2. void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
该方法用来注册更多的bean到spring容器中
FactoryBean
FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程,
通过getObject 生成一个bean交给Spring容器管理
InitializingBean
提供初始化bean方法,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。
该方法将在所有的属性被初始化后调用,但是会在init前调用
如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertiesSet方法,然后再调用init-method中指定的方法。
在返回bean之前调用afterPropertiesSet做一些准备操作
DisposableBean
bean销毁时候调用