postProcessProperties
postProcessBeforeInitialization/postProcessAfterInitialization
instantiate方法
1. 遍历beanPostProcessor,判断是否存在SmartInstantiationBeanPostProcessor类型的processor,调用方法determineCandidateConstructors,查找存在依赖注入的构造方法,即存在@autowired注解标注的构造器
遍历所有方法,查找带有@Lookup注解的方法,生成LookupOverride对象放入beanDefinition的字段中
postProcessMergedBeanDefinition
afterSingletonCreation方法
populateBean方法
@Autowired方法及字段的注入:从InjectionMeatadata中获取字段和方法信息,反射调用
是
factoryMethodName是否为空
将当前正在实例化的beanName放入singletonCurrentlysInCreation,标识当前bean正在实例化
beforeSingletonCreation方法
registerDisposableBeanIfNecessary方法
查找带有@autowired和@value注解的构造方法
postProcessBeforeInstantiation
否
调用含有@autowired的构造方法,进行实例化:注: 依赖的引用对象会再次触发getBean的操作,此时会进行依赖对象的实例化操作
在bean实例化之前进行相应的处理,该接口返回一个Object对象
在bean实例化后且依赖属性注入之前调用,该接口将返回一个Boolean值
反射factory-method指定的方法,该方法会返回一个自定义对象,这样后面的实例化过程不再执行
instantiateBean方法
doCreateBean方法
查找带有@PostConstruct和@PreDestroy的方法,封装为LifeCycleMetadata对象
遍历beanPostProcessor,是否存在实现InstantiationBeanPostProcessor接口的processor对象,调用postProcessBeforeInstantiation方法
ALL
applyMergeBeanDefinitionPostProcessors
@Resource标注的字段和方法的注入:从InjectionMetadata中获取信息,反射调用
若实例化成功,将当前beanName从耳二级和三级缓存中移除,并加入一级缓存singletonObjects中,当再次getBean时直接在缓存中获取返回
initializeBean方法
addSingleton方法
postProcessAfterInstantiation
createInstance方法
postProcessBeforeInitialization
AutowiredAnnotationBeanPostProcessor
autowireConstructor方法
对于@Autowired注解标注的引用类型参数,会再次触发getBean操作,获取其出入参对象
START
instantiateUsingFactoryMethod方法
将正在创建的bean放入缓存(ObjectFactory中),也被称之为三级缓存
BeanPostProcessor
1. 遍历beanPostProcessor,若存在InstantiationAwareBeanPostProcessor类型的processor,调用其方法postProcessAfterInstantiation(注:该方法返回值为boolean类型,必须返回true,否则会下面的属性注入操作不能执行)2. 对依赖属性执行DI(依赖注入):依赖的引用类型的属性再次触发getBean操作,使其进行实例化操作,调用AutowiredAnnotationBeanPostProcessor中方法postProcessProperties方法,完成对象属性的注入
查找@Autowired和@Value的字段,封装为InjectionMetadata对象返回,该对象持有一个当前beanClass的引用及InjectedElement对象的list集合
@PostConstruct标注的方法在beforeInitialization中完成调用,由InitDestroyBeanPostProcessor实现(CommonAnnotationBeanPostProcessor是其子类),从LifecycleMetadata获取相应的调用信息,通过反射完成调用
Field->AutowiredFieldElement->InjectionMetadata.InjectedElement->InjectiionMetadataMethod->AutowiredMethodElement->InjectionMetadata.InjectedElement->InjectionMetadata
若实现接口DisposableBean或配置@PreDestroy等,则对当前bean进行注册,即创建一个DisposableBeanAdapter方法disposableBeans集合中(注:该方法是通过监听web容器的销毁事件触发,即ContextLoaderListener.contextDestroyed方法触发调用--》closeWebApplicationContext方法),由InitDestroyBeanPostProcessor
返回带有注解@autowired和@value注解的构造方法数组
getSingleton方法
1. invokeAwareMethods:完成对相关aware接口的调用,设置相关属性值2. applyBeanPostProcessorsBeforeInitialization:遍历beanPostProcessor,调用方法postProcessBeforeInitialization,@PostConstruct方法的调用便是在这儿通过反射完成方法调用(InitDestroyAnnotationBeanPostProcessor)3. invokeInitMethods:完成对实现了InitializeBean接口的方法调用4. applyPostProcessorsAfterInitialization:遍历beanPostProcessor,调用方法postProcessAfterInitialization
END
若返回的Object不为空,:1. 则会阻断spring下面的实例化过程,如属性的依赖注入、对bean的缓存等操作都不在执行;2. 且会再次调用processor的postProcessAfterInstantiation方法
这里的Initialization操作可以认为是对接口InitializeBean接口方法的调用,即Before为调用方法之前/After为调用方法之后
postProcessAfterInitialization
CommonAnnotationBeanPostProcessor
BeanPostProcessor实例
AbstractBeanFactory
查找带有和@Resource的方法和属性,封装为InjectionMetadat,该对象持有一个beanClass的引用和InjectedMetadata的list集合
@Value的只通过EmmbeddedValueResolver获取
是否存在引用类型依赖注入的构造方法
resolveBeforeInstantiattion()方法
自定义实现该接口的processor,在该方法必须返回true,否则后面的依赖注入则无法完成
afterInitialization为AOP代理对象创建的入口(AbstractAutoProxyCreator),判断是否存在适合改bean的切面(Advisors),若存在则创阿金代理对象返回
@Resource:Field->ResourceElement->InjectionMetadata.InjectedMetadataMethod->ResourceElement->InjectionMetadata.InjectedMetadata
addSingletonFactory方法
在singletonCurrentlysIncreation中将beanName移除,标识已实例化完成
ALL:postProcess(Before/After)Initialization
determineConstructorsFromBeanPostProcessor方法
determineCandidateConstructors
1. 遍历beanPostProcessor,判断是否存在MergedBeanDefinitionPostProcessor类型的processor,调用方法postProcessMergedBeanDefinition,收集需要注入的属性和方法(@Autowired、@Resource、@Value、@PostConstruct、@PreDestroy)2. 收集到的属性和方法,封装为InjectionMetadata对象
@PostConstruct方法的调用:从LifecycleMetadata中获取信息,反射完成方法调用
@Autowired标注的引用类型注入会触发getBean操作,若依赖bean未实例化,此时会进行实例化操作
doGetBean方法
InstantiationBeanPostProcessor:postProcess(Before/After)Instantiation