目录
1、生成BeanDefinition
BeanDefinitionRegistry接口
DefaultListableBeanFactory实现类
2、合并BeanDefnition
AbstractBeanFactory类
3、BeanFactoryPostProcessor的方法回调
AbstractApplicationContext类
PostProcessorRegistrationDelegate类
4、BeanPostProcessor的注册
AbstractApplicationContext类
PostProcessorRegistrationDelegate类
AbstractBeanFactory类
5、执行InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation方法
AbstractApplicationContext类
DefaultListableBeanFactory类
AbstractBeanFactory类
DefaultSingletonBeanRegistry类
ObjectFactory接口
AbstractAutowireCapableBeanFactory类
6、Bean的实例化
AbstractAutowireCapableBeanFactory类
7、执行MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition方法
AbstractAutowireCapableBeanFactory类
8、Bean的属性填充
AbstractAutowireCapableBeanFactory类
9、BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口对应的set方法回调
AbstractAutowireCapableBeanFactory类
10、执行BeanPostProcessor#postProcessBeforeInitialization方法
AbstractAutowireCapableBeanFactory类
11、执行InitializingBean#afterPropertiesSet方法
AbstractAutowireCapableBeanFactory类
12、执行BeanPostProcessor#postProcessAfterInitialization方法
AbstractAutowireCapableBeanFactory类
13、执行SmartInitializingSingleton#afterSingletonsInstantiated方法
SmartInitializingSingleton接口
DefaultListableBeanFactory类
1、生成BeanDefinition
Spring会为Bean创建对应的Bean定义信息对象(也就是BeanDefinition类型对象),并储存到DefaultListableBeanFactory类定义的beanDefinitionMap集合中
BeanDefinitionRegistry接口
package org.springframework.beans.factory.support;// 用于管理BeanDefinition对象的接口
public interface BeanDefinitionRegistry extends AliasRegistry {// 定义了添加BeanDefinition的方法 void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException;// ...
}
DefaultListableBeanFactory实现类
package org.springframework.beans.factory.support;//DefaultListableBeanFactory实现了BeanDefinitionRegistry接口
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {// ...// 用于存储Bean的定义信息,key是beanName, value是BeanDefinition对象private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);// 实现了添加Bean定义信息的方法@Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {// ...// 存放Bean的定义信息到beanDefinitionMap集合中this.beanDefinitionMap.put(beanName, beanDefinition);// ...}// ...
}
如下图中可以看到beanDefinitionMap集合中存储了Bean的Bean定义信息,有GenericBeanDefinition类型对象,也有RootBeanDefinition类型对象
2、合并BeanDefnition
AbstractBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {// ...// 用于存放合并后的BeanDefinition, key为beanName,value为RootBeanDefinition对象private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256);// 获取合并后的RootBeanDefinitionprotected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {// 先从集合中获取RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);// 已经合并过的直接返回if (mbd != null && !mbd.stale) {return mbd;}// 合并BeanDefinition,返回RootBeanDefinitionreturn getMergedBeanDefinition(beanName, getBeanDefinition(beanName));}// ...
}
如下图中所示,BeanDefinition已经合并
3、BeanFactoryPostProcessor的方法回调
AbstractApplicationContext类
package org.springframework.context.support;public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext {// ...// Spring容器启动的关键方法refresh()@Overridepublic void refresh() throws BeansException, IllegalStateException {// ...// 执行容器中的Bean工厂后置处理器invokeBeanFactoryPostProcessors(beanFactory);// ...}// ...
}
PostProcessorRegistrationDelegate类
package org.springframework.context.support;final class PostProcessorRegistrationDelegate {public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {// ...// 执行BeanDefinitionPostProcessor的postProcessBeanDefinitionRegistry方法invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);// 执行BeanDefinitionPostProcessor的postProcessBeanFactory方法invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);// 执行BeanFactory的postProcessBeanFactory方法invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);// ...}private static void invokeBeanDefinitionRegistryPostProcessors(Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {postProcessor.postProcessBeanDefinitionRegistry(registry);}}private static void invokeBeanFactoryPostProcessors(Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {for (BeanFactoryPostProcessor postProcessor : postProcessors) {postProcessor.postProcessBeanFactory(beanFactory);}}
}
4、BeanPostProcessor的注册
AbstractApplicationContext类
package org.springframework.context.support;public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext {// ...// Spring容器启动的关键方法refresh()@Overridepublic void refresh() throws BeansException, IllegalStateException {// ...// 注册Bean后置处理器registerBeanPostProcessors(beanFactory);// ...}// ...
}
PostProcessorRegistrationDelegate类
package org.springframework.context.support;final class PostProcessorRegistrationDelegate {public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {// ...// 添加Bean后置处理器到容器中registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);registerBeanPostProcessors(beanFactory, orderedPostProcessors);registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);registerBeanPostProcessors(beanFactory, internalPostProcessors);beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));// ...}// 向容器中添加BeanPostProcessorprivate static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {for (BeanPostProcessor postProcessor : postProcessors) {beanFactory.addBeanPostProcessor(postProcessor);}}
}
AbstractBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {// ...// 用于存放容器中的Bean后置处理器的集合private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>();// 执行添加BeanPostProcessor的逻辑@Overridepublic void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {// ...this.beanPostProcessors.remove(beanPostProcessor);if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {this.hasInstantiationAwareBeanPostProcessors = true;}if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {this.hasDestructionAwareBeanPostProcessors = true;}this.beanPostProcessors.add(beanPostProcessor);}// ...
}
5、执行InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation方法
AbstractApplicationContext类
package org.springframework.context.support;public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext {// ...// Spring容器启动的关键方法refresh()@Overridepublic void refresh() throws BeansException, IllegalStateException {// ...// 实例化所有剩余的非懒加载的单例BeanfinishBeanFactoryInitialization(beanFactory);// ...}protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// ...beanFactory.preInstantiateSingletons();}// ...
}
DefaultListableBeanFactory类
package org.springframework.beans.factory.support;public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {// ...@Overridepublic void preInstantiateSingletons() throws BeansException {// 获取所有的beanNameList<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...// 遍历beanNamefor (String beanName : beanNames) {// ...// 获取合并后的RootBeanDefinitionRootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);// 非抽象&&单例的&&非懒加载的if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {// 调用getBean方法getBean(beanName);}// ...}}// ...
}
AbstractBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {// ...@Overridepublic Object getBean(String name) throws BeansException {// 调用doGetBean方法return doGetBean(name, null, null, false);}protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {// ...if (mbd.isSingleton()) {// 参数一:beanName// 参数二:ObjectFactory函数式接口sharedInstance = getSingleton(beanName, () -> {try {return createBean(beanName, mbd, args);}catch (BeansException ex) {// ...}});// ...}// ...}// ...
}
DefaultSingletonBeanRegistry类
package org.springframework.beans.factory.support;public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {// 一级缓存private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);// 三级缓存private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);// 二级缓存private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);// ...public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory){// ...Assert.notNull(beanName, "Bean name must not be null");synchronized (this.singletonObjects) {// 先从一级缓存中获取bean对象Object singletonObject = this.singletonObjects.get(beanName);// 一级缓存中没有if (singletonObject == null) {try {// 这里执行传递过来的lambda表达式,也就是createBean方法singletonObject = singletonFactory.getObject();newSingleton = true;}catch (IllegalStateException ex) {// ....}}}// ...}}
ObjectFactory接口
package org.springframework.beans.factory;// 函数式接口
@FunctionalInterface
public interface ObjectFactory<T> {T getObject() throws BeansException;}
AbstractAutowireCapableBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {// ...try {// 执行BeanPostProcessor的实例化之前方法回调Object bean = resolveBeforeInstantiation(beanName, mbdToUse);if (bean != null) {return bean;}}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,"BeanPostProcessor before instantiation of bean failed", ex);}// ...}@Nullableprotected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {Object bean = null;// ...// 执行Bean实例化之前的方法bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);// ...}@Nullableprotected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {// 获取容器中的BeanPostProcessor集合,进行遍历for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;// 执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);if (result != null) {return result;}}}return null;}// ...
}
6、Bean的实例化
AbstractAutowireCapableBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...// 实例化BeanBeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {instanceWrapper = createBeanInstance(beanName, mbd, args);}// ...}// ...
}
7、执行MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition方法
AbstractAutowireCapableBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...// 执行MergedBeanDefinitionPostProcessor方法applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);// ...}protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {// 获取容器中的BeanPostProcessor,遍历for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof MergedBeanDefinitionPostProcessor) {MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;// MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法回调bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);}}}// ...
}
8、Bean的属性填充
AbstractAutowireCapableBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...Object exposedObject = bean;try {// 填充属性populateBean(beanName, mbd, instanceWrapper);// ...}catch (Throwable ex) {// ...}// ...}protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {// ...// 执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法回调(Bean实例化后的方法回调)if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {return;}}}}// 执行InstantiationAwareBeanPostProcessor的postProcessProperties方法回调// AutowiredAnnotationBeanPostProcessor对@Autowired、@Value注解的处理// CommonAnnotationBeanPostProcessor对@Resource注解的处理for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);// ...}}// ...}// ...
}
9、BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口对应的set方法回调
AbstractAutowireCapableBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...Object exposedObject = bean;try {//Bean的初始化exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {// ...}// ...}protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {// ...// 执行Aware接口的方法invokeAwareMethods(beanName, bean);// ...}private void invokeAwareMethods(final String beanName, final Object bean) {if (bean instanceof Aware) {// BeanNameAware的setBeanName方法回调if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}// BeanClassLoaderAware的setBeanClassLoader方法回调if (bean instanceof BeanClassLoaderAware) {ClassLoader bcl = getBeanClassLoader();if (bcl != null) {((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);}}// BeanFactoryAware的setBeanFactory的方法回调if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}}// ...
}
10、执行BeanPostProcessor#postProcessBeforeInitialization方法
AbstractAutowireCapableBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...Object exposedObject = bean;try {//Bean的初始化exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {// ...}// ...}protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {// ...// 执行BeanPostProcessor的初始化前方法回调Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}// ...}@Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;// 获取容器中的BeanPostProcessor,遍历for (BeanPostProcessor processor : getBeanPostProcessors()) {// 执行BeanPostProcessor的postProcessBeforeInitialization方法回调// 这里执行了CommonAnnotationBeanPostProcessor对@PostConstruct注解的处理Object current = processor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}// ...
}
11、执行InitializingBean#afterPropertiesSet方法
AbstractAutowireCapableBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...Object exposedObject = bean;try {//Bean的初始化exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {// ...}// ...}protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {// ...// 执行初始化方法invokeInitMethods(beanName, wrappedBean, mbd);// ...}protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean = (bean instanceof InitializingBean);if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {// ...// 执行InitializingBean#afterPropertiesSet方法回调((InitializingBean) bean).afterPropertiesSet();}}// ...
}
12、执行BeanPostProcessor#postProcessAfterInitialization方法
AbstractAutowireCapableBeanFactory类
package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...Object exposedObject = bean;try {//Bean的初始化exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {// ...}// ...}protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {// ...// 执行BeanPostProcessor初始化后的方法if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}// ...}@Overridepublic Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {// 执行BeanPostProcessor#postProcessAfterInitialization方法回调Object current = processor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}// ...
}
13、执行SmartInitializingSingleton#afterSingletonsInstantiated方法
SmartInitializingSingleton接口
package org.springframework.beans.factory;public interface SmartInitializingSingleton {void afterSingletonsInstantiated();
}
DefaultListableBeanFactory类
package org.springframework.beans.factory.support;public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {@Overridepublic void preInstantiateSingletons() throws BeansException {// ...List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// 第一次遍历beanNames// ...// 第二次遍历beanNamesfor (String beanName : beanNames) {Object singletonInstance = getSingleton(beanName);if (singletonInstance instanceof SmartInitializingSingleton) {final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;// ...// 执行SmartInitializingSingleton#afterSingletonsInstantiated方法回调smartSingleton.afterSingletonsInstantiated();}}}
}