BeanDefinition生成
Spring在启动时,需要先扫描到需要创建的类,将这些类解析为Bean定义(Bean定义了Bean的一些创建信息,如是否单例,是否懒加载,beanClass等),生成好的Bean定义存储在beanDefinitionMap中,此时的BeanClass还是类名字符串(如: "com.heoller.entity.User"),没有加载成Class对象。
// org.springframework.beans.factory.support.DefaultListableBeanFactory private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
RootBeanDefinition生成
/* * 合并bean定义, 生成RootBeanDefinition。 * <bean id="commonBean" abstract="true" scope="prototype" /> * <!-- 此时user的scope属性将会是prototype --> * <bean id="user" class="com.heoller.entity.User" parent="commonBean" /> */ RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
加载beanClass
// 加载beanClass并返回Class对象 Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
执行实例化前的BeanPostProcessors
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
// 实例化前执行InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
return result;
}
}
}
return null;
} 选择构造方法
实例化
根据构造方法反射创建实例
RootBeanDefinition后置处理器
可以通过这个后置处理器完成BeanDefinition的修改,比如: 修改bean的初始化方法、propertyValues等,作用于Bean的初始化阶段。
// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
填充属性
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
执行Aware
private void invokeAwareMethods(String beanName, Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
} 执行初始化前的BeanPostProcessors
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
// CommonAnnotationBeanPostProcessor会处理@PostConstruct注解方法
// ApplicationContextAwareProcessor会执行各种Aware方法
Object current = processor.postProcessBeforeInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
} 执行初始化方法
protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)
throws Throwable {
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isTraceEnabled()) {
logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
((InitializingBean) bean).afterPropertiesSet();
return null;
}, getAccessControlContext());
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
((InitializingBean) bean).afterPropertiesSet();
}
}
if (mbd != null && bean.getClass() != NullBean.class) {
String initMethodName = mbd.getInitMethodName();
if (StringUtils.hasLength(initMethodName) &&
!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
invokeCustomInitMethod(beanName, bean, mbd);
}
}
} 执行初始化后的BeanPostProcessors
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
} 
京公网安备 11010502036488号