首先spring加载bean对象并不是根据bean的Class定义来创建bean对象的,在容器启动的时候,他会扫描bean的定义信息,扫描bean的定义信息是在refresh()方法里的invokeBeanFactoryPostProcessors()方法,在这个方法里边他会执行BeanFactoryPostProcessors后置处理器及其子接口BeanDefinitionRegistryPostProcessor,执行顺序是先执行BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法,然后执行BeanFactoryPostProcessor接口的postProcessBeanFactory方法
对于BeanDefinitionRegistryPostProcessor接口的rpostProcessBeanDefinitionRegistry方法,该步骤会扫描指定包下面的标有注解的类,然后将其变成BeanDefinition对象,然后放入到spring的BeanDefintionMap中,用于之后创建springbean的时候使用beanDefinition
其中registerBeanPostProcessors方法根据实现了PriorityOrdered,Ordered接口,排序后注册所有的BeanPostProcessor后置处理器,主要用于SpringBean创建的时候,执行这些后置处理器的方法,
然后 finishBeanFactoryInitialization是完成非懒加载的Spring bean的创建的工作,该步骤中会有8个后置处理的方法4个后置处理器的类贯穿在对象的实例化、赋值、初始化、和销毁的过程中
-
首先bean的创建调用的是createBean方法,createBean方法里一共有四个步骤
- 根据设置的Class属性或者根据ClassName来解析Class——->resolveBeanClass(mbd,beanName);
- 对override属性进行标记及验证——>mbd.prepareMethodOverrides();
- 应用初始化前的后置处理器,解析指定bean是否存在代理,如果存在代理就返回代理对象来代替真正的实例——>resolveBeforeInstantiation(beanName,mbd) ; Aop就是在这里实现的
- 如果没有代理,开始创建bean—–>doCreateBean(beanName,mbd,args);
-
实例化前的后置处理器
InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(beanClass,beanName)方法
查找所有的InstantiationAwareBeanPostProcessor,依次调用InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation获取bean的实例对象,如果能够获取到,那么就将返回值作为当前bean的实例,那么spring自带的实例化bean的过程就被跳过了,如果能够获取到,那么下面的生命周期就不会执行了.
-
SmartInstantiationAwareBeanPostProcessor# determineCandidateConstructors
检测bean的构造器,可以检测出多个候选的构造器
它有一个重要的实现类:AutowiredAnnotationBeanPostProfessor 作用:具体需要使用那个构造器,spring为开发者提供了一个接口,允许开发者自己来判断用哪个构造器 实现:返回候选的构造器列表,可以将构造器中标注了@Autowired注解的方法返回,用来查找一个最合适的创建bean的构造器
-
对象的实例化
-
MergedBeanDefinitionPostProcessor# postProcessMergedBeanDefinition
缓存bean的注入信息的后置处理器,仅仅是缓存或者干脆叫做查找更加合适,没有完成注入,注入是另外一个后置处理器的作用
-
SmartInstantiationAwareBeanPostProcessor# getEarlyBeanReference
循环引用的后置处理器,这个东西比较复杂, 获得提前暴露的bean引用。主要用于解决循环引用的问题,只有单例对象才会调用此方法,他能提前暴露bean。
-
InstantiationAwareBeanPostProcessor# postProcessAfterInstantiation
方法在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。如果该方法返回false,会忽略属性值的设置;如果返回true,会按照正常流程设置属性值。方法不管postProcessBeforeInstantiation方法的返回值是什么都会执行
-
属性注入populateBean
- InstantiationAwareBeanPostProcessor处理器的postProcessAfterInstantiation函数的应用,此函数可以控制程序是否继续进行属性填充
- 根据注入类型(byName/byType),提取依赖的bean,并统一存入PropertyValues中
- 应用InstantiationAwareBeanPostProcessor处理器的postProcessPropertyValues方法,对属性获取完毕填充填对属性的再次处理
- 将所有的PropertyValues中的属性填充到BeanWrapper中.
postProcessProperties方法会完成属性注入: 这个方法有两个重要的实现类 AutowiredAnnotationBeanPostProcessor在这个方法中对@Autowired @Value标注的字段,方法注入值. CommonAnnotationBeanPostProcessor在这个方法中对@Resource标注的字段和方法注入值
-
调用InvokeAwareMethods方法
调用invokeAwareMethods方法,判断该bean是否为BeanNameAware,BeanClassLoaderAware,BeanFactoryAware的子类,然后执行相应的setBeanName,setBeanFactory,setClassLoader方法
-
BeanPostProcessor# postProcessBeforeInitialization
该方法会在初始化之前执行,其中有一个比较重要的实现类ApplicationContextAwareProcessor,该后置处理器的一个作用就是当应用程序定义的Bean实现ApplicationContextAware接口时注入ApplicationContext对象
如果当前方法返回null,该方法结束,这个方法也称为bean初始化前操作
ApplicationContextAwareProcessor:
如果bean实现EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware接口,那么在ApplicationContextAwareProcessor#postProcessBeforeInitialization会依次调用接口中的方法,将Aware前缀对应的对象注入到bean实例中
CommonAnnotationBeanPostProcessor:
CommonAnnotationBeanPostProcessor#postProcessBeforeInitialization中会调用bean中所有标注@PostConstruct注解的方法
-
激活用户自定义的初始化方法#invokeInitMethods(初始化)
初始化阶段分为两个过程
-
如果bean实现了InitializingBean接口,就执行其afterPropretiesSet方法,进行bean的初始化
-
调用bean定义的时候指定的初始化方法
方式一:xml方式指定初始化方法
方式二:@Bean的方式指定初始化方法@Bean(initMethod=“初始化方法”)
方式三:api的方式指定初始化方法 this.beanDefinition.setInitMethodName(methodName)
-
-
BeanPostProcessor# postProcessAfterInitialization
该后置处理器的执行是在调用init方法后面进行执行,主要是判断该bean是否需要被AOP代理增强,如果需要的话,则会在该步骤返回一个代理对象。
-
SmartInitializingSingleton# afterSingletonsInstantiated
该方法会在所有的非懒加载单实例bean都成功创建并且放到Spring IOC容器之后,依次遍历所有的bean,如果当前这个bean是SmartInitializingSingleton的子类,那么就强转成SmartInitializingSingleton类,然后调用SmartInitializingSingleton的afterSingletonsInstantiated方法
-
注册DisposableBean
spring中不但提供了对初始化方法的扩展入口,同样也提供了销毁方法的扩展入口,对于销毁方法的扩展,除了我们熟知的配置属性destroy-method方法外,用户还可以注册后置处理器DestructionAwareBeanPostProcessor来统一处理bean的销毁方法.