bean生命周期
1.扫描指定包路径下的class文件(获得每个Resource对象,生成MetadataReader对象)
2.生成BeanDefinition(MetadataReader对象生成一个ScannedGenericBeanDefinition对象)
3.合并BeanDefinition(如果某个BeanDefinition存在父BeanDefinition,那么则要进行合并)
4.加载类(利用BeanFactory所设置的类加载器来加载类,如果没有设置,则默认使用ClassUtils.getDefaultClassLoader()所返回的类加载器来加)
5.实例化前(InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(Class beanClass, String beanName))
如果这一步返回了bean,则执行InstantiationAwareBeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName),返回的bean不为null不再执行后续实例化流程
如:AbstractAutoProxyCreator.postProcessBeforeInstantiation() 遍历所有beanName,解析出被@Aspect标记的切面类和类中的所有Advice方法(通知)。
6.实例化(构造方法反射得到一个实例)
7.BeanDefinition的后置处理(MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName))
eg:AutowiredAnnotationBeanPostProcessor的 postProcessMergedBeanDefinition()找出注入点
8.属性填充(InstantiationAwareBeanPostProcessor.postProcessProperties(PropertyValues pvs, Object bean, String beanName))
eg: AutowiredAnnotationBeanPostProcessor的postProcessProperties()会遍历所找到的注入点依次进行注入
9.执行Aware
((BeanNameAware) bean).setBeanName(beanName);
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
10.初始化前
BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName)
eg: ApplicationContextAwareProcessor.postProcessBeforeInitialization()中执行 ApplicationContextAware回调
InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName) 执行@PostConstruct注释的方法
11.初始化
((InitializingBean) bean).afterPropertiesSet();
执行BeanDefinition中指定的初始化方法
12.初始化后
BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)
eg:AbstractAutoProxyCreator.postProcessAfterInitialization() 进行AOP
//实例化非懒加载单例bean
DefaultListableBeanFactory.preInstantiateSingletons(){
...
// 获取合并后的BeanDefinition
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
...
// 创建Bean对象
getBean(beanName);
...
}
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
AbstractBeanFactory.doGetBean(
String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
throws BeansException {
...
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton(beanName);
throw ex;
}
});
beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
...
//创建bean
AbstractAutowireCapableBeanFactory.createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args){
...
// 马上就要实例化Bean了,确保beanClass被加载了
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
...
// 实例化前
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
...
//实例化
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
...
//BeanDefinition的后置处理
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
...
// 属性填充
populateBean(beanName, mbd, instanceWrapper);
// 初始化
exposedObject = initializeBean(beanName, exposedObject, mbd);
...
}
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
...
//执行Aware回调
invokeAwareMethods(beanName, bean);
...
// 初始化前
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
// 初始化
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
// 初始化后
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
...
}