spring的bean的生命周期
spring的bean在容器中的生命周期如下:
1 spring bean 的元信息配置阶段
2 spring bean的元信息解析阶段
3 spring bean 的注册阶段
4 spring BeanDefinition合并阶段
5 spring Bean class加载阶段
6 spring Bean的实例前阶段
7 spring bean的实例化阶段
9 spring bean的实例化后阶段
9 spring bean属性赋值前阶段(被注入之前)
10 springbean的Aware接口回调阶段
11 springbean的初始化前阶段
12 spring bean的初始化阶段
13 spring bean的初始化后阶段
14 pring bean的初始化后完成阶段
15 spring bean 销毁前阶段
15 spring bean 销毁阶段
1 spring bean 的元信息配置阶段
2 spring bean的元信息解析阶段
3 spring bean 的注册阶段
4 spring BeanDefinition合并阶段
5 spring Bean class加载阶段
6 spring Bean的实例前阶段
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
这个类也是BeanPostProcessor,可以通过BeanFactory.addBeanPostProcessor添加 这个方法是非主流的方法,这个方法会返回一个object,如果返回null,则会根据beandefinition进行初始化,如果返回对象,则不会实例化调用doCreateBean方法
这个方法可以创建代理类(尤其是适合生成可以远程调用的代理类)
这个方法会在AbstyractAutowireCapableBeanFactory中的resolveBeforeInstantiation-》resolveBeforeInstantiation-》applyBeanPostProcessorsBeforeInstantiation方法中被调用,
7 spring bean的实例化阶段
InstantiationStrategy里面有一个方法instantiate, SimpleInstantionStrategy实现Instantiation,而CglibSubClassingInstantiationStrategy继承SimpleInstantionStrategy
方法经过AbstractAutowireCapableBeanFactory.doGreateBean->createBeanInstance->
9 spring bean的实例化后阶段
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation(),如果返回false,则不会进行从beanDefinition里面的属性赋值
9 spring bean属性赋值前阶段(被注入之前)
不同版本有不同的回调接口
spring1.2-5.0,InstantiationAwareBeanPostProcessor.postProcessPropertyValue
spring5.1:InstantiationAwareBeanPostProcessProcessor.postProcessProperties,如果返回null,则表示不修改,否则返回赋值PropertySources 然后赋值给对象
10 springbean的Aware接口回调阶段
这个阶段属于bean的初始化阶段,Aware接口回调顺序,因为这些方法也在doCreateBean中 ,而且在springboot中有一部分Aware主要通过ApplicationContextAwareProcessor的postProcessBeforeInitialization处理,这个和springbean的初始化前阶段相似
BeanNameAware,BeanClassLoaderAware, BeanFactoryAware
EnvironmentAware EmbeddeValueResolverAware ResourceLoaderAware ApplicationEentPushlisherAware MessaegSourceAware ApplicationContextAware,这几个是属于ApplicationContext生命周期中的,需要在ApplicationContextAwareProcessor中被调用
11 springbean的初始化前阶段
事实上AbstractBeanFactory里面有一个BeanPostProcessList,这个是个有序的,而且AbstractApplicaltionContext在prepareBeanFactory中就add ApplicationContextAwareProcessor,所以ApplicationContextAwareProcessor是所有BeanPostProcessor中第一个执行postProcessBeforeInitialization,所以其流程如下
AbstractAutowireCapableBeanFactory#doCreateBean -》 AbstractAutowireCapableBeanFactory#initializeBean(String, Object, RootBeanDefinition)-》AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
Object[新对象] postProcessBeforeInitialization(Object originalbean, String beanName)
这个方法如果返回null,则不修改这个bean,而如果返回新对象,则会用新对象替换老对象
方法流程如下AbstractAutowireCapableBeanFactory#doCreateBean -》 AbstractAutowireCapableBeanFactory#initializeBean(String, Object, RootBeanDefinition)-》AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
12 spring bean的初始 化阶段
bean的初始化顺序是@PostConstruct->InitializingBean.afterPropertiesSet->@Bean(initMethod)
@PostConstruct这个注解需要BeanPostProcessor驱动,具体驱动是CommonAnnotationBeanPostProcessor的postProcessBeforeInitialization
而initialingBean合initMethod都是在AbstractAutowireCapableBeanFactory#doCreateBean -》 AbstractAutowireCapableBeanFactory#initializeBean(String, Object, RootBeanDefinition)-》AbstractAutowireCapableBeanFactory#invokeInitMethods,而invokeInitMethod恰好在applyBeanPostProcessorsBeforeInitialization之后执行的
13 spring bean的初始化后阶段
BeanPostProcessor.postProcessAfterInitialization,方法和postPorcessAfterInitialization
14 pring bean的初始化后完成阶段
方法回调需要基于spring 4.1+版本支持
SmartInitializingSingleton#void afterSIngletonInstantiated()
这个方法通常需要在spring appliclationContext场景下使用是在AbstractApplicationContext中的refresh ->finishBeanFactoryInitialization中执行
这个是当所有的beanDefinition变成bean的时候就会调用,这个回调是当bean已经完全初始化了才会调用
15 spring bean 销毁前阶段
15 spring bean 销毁阶段
spring的配置元信息
spring的BeanDefinition有三种GenericBeanDefinition,RootBeanDefinition以及AnnotatedBeanDefinition