目錄
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();}}}
}