Spring 核心流程
- 前言
- 一、AbstractApplicationContext#refresh 方法解析
- 1.1 前置
- 1.2 refresh 方法
- 1.2.1 prepareRefresh
- 1.2.2 obtainFreshBeanFactory
- 1.2.3 prepareBeanFactory
- 1.2.4 postProcessBeanFactory
- 1.2.5 invokeBeanFactoryPostProcessors
- 1.2.6 registerBeanPostProcessors
- 1.2.7 initApplicationEventMulticaster
- 1.2.8 onRefresh
- 1.2.9 registerListeners
- 1.2.10 finishBeanFactoryInitialization
- 1.2.11 finishRefresh
- 1.3 Bean 的生命周期
- 1.3.1 入口
- 1.3.2 preInstantiateSingletons
- 1.3.3 doGetBean
- 1.3.4 createBean
- 1.3.5 doCreateBean
- 1.3.6 populateBean
- 1.3.7 initializeBean 初始化 bean
- 二、各种 BeanPostProcessor(BPP)
- InstantiationAwareBeanPostProcessor
- MergedBeanDefinitionPostProcessor
- SmartInstantiationAwareBeanPostProcessor
- DestructionAwareBeanPostProcessor
- 总结
- Bean 的生命周期
前言
基于源码
springboot2.7.3
,对应spring5.3.22
本章源码只注释AbstractApplicationContext#refresh
方法
一、AbstractApplicationContext#refresh 方法解析
1.1 前置
Spring 的大致流程是先将 Bean 读取成
BeanDefinition
,然后再实例化 bean,初始化Bean
无论是使用注解还是 XML 配置的方式,都会将 Bean 解析成BeanDefinition
, XML解析的核心类是XmlBeanDefinitionReader
1.2 refresh 方法
模板方法,里面大量的扩展点可交由子类实现
// 刷新前的操作prepareRefresh();// Tell the subclass to refresh the internal bean factory.// 获取 BeanFactoryConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.// 预处理 beanFactory// 向 beanFactory 添加了一些 ignoreDependencyInterfaceprepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.// 交由子类实现, 在刷新前对 beanFactory 做一些操作postProcessBeanFactory(beanFactory);StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");// Invoke factory processors registered as beans in the context.// 执行 BFPPinvokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.// 注册 BPPregisterBeanPostProcessors(beanFactory);beanPostProcess.end();// Initialize message source for this context.// 初始化 MessageSource, i18n 相关initMessageSource();// Initialize event multicaster for this context.// 初始化事件发布器initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.// 刷新容器onRefresh();// Check for listener beans and register them.// 注册事件监听器registerListeners();// Instantiate all remaining (non-lazy-init) singletons.// 重要, 完成 bean 的初始化工作finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.// 结束刷新finishRefresh();
1.2.1 prepareRefresh
protected void prepareRefresh() {// Switch to active.this.startupDate = System.currentTimeMillis();this.closed.set(false);this.active.set(true);// ... 日志打印// Initialize any placeholder property sources in the context environment.// 初始化 PropertySources, 如果是 servlet 应用的话, 会将 ServletContext 的配置信息放入到 Environment 中initPropertySources();// Validate that all properties marked as required are resolvable:// see ConfigurablePropertyResolver#setRequiredProperties// 如果有必须的配置, 验证配置是否存在getEnvironment().validateRequiredProperties();// Store pre-refresh ApplicationListeners...// earlyApplicationListeners:提前暴露的 Listener// 兼容 SpringBootif (this.earlyApplicationListeners == null) {this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);}else {// Reset local application listeners to pre-refresh state.this.applicationListeners.clear();this.applicationListeners.addAll(this.earlyApplicationListeners);}// Allow for the collection of early ApplicationEvents,// to be published once the multicaster is available...this.earlyApplicationEvents = new LinkedHashSet<>();
}
1.2.2 obtainFreshBeanFactory
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {// 刷新 beanFactory// 交由子类实现的方法// 1. 如果是 Spring 应用, 则是 AbstractRefreshableApplicationContext, 会创建 beanFactory// 2. 如果是 SpringBoot 应用, 实现类则是 GenericApplicationContext, beanFactory 已经提前创建好了, 直接获取出来refreshBeanFactory();return getBeanFactory();
}
1.2.3 prepareBeanFactory
对 BeanFactory 做一些前置处理
// 1. ignoreDependencyInterface
// 2. registerResolvableDependency
// 3. 将 environment、System、ApplicationSetup 等 Bean 加入到 beaFactory
// 4. 将 ApplicationContext(this) 注册到 BeanFactory
1.2.4 postProcessBeanFactory
钩子, 交给子类实现,这里看 SpringBoot 的实现
@Override
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 添加了一个 BPPbeanFactory.addBeanPostProcessor(new WebApplicationContextServletContextAwareProcessor(this));beanFactory.ignoreDependencyInterface(ServletContextAware.class);// 将 Request 和 Session 两个 Scope 注册到 ApplicationContextregisterWebApplicationScopes();
}
1.2.5 invokeBeanFactoryPostProcessors
执行 BFPP
- BFPP 主要分为两种,一种是
BeanDefinitionRegistryPostProcessor
,这个类可以用来注册BeanDefinition
,而新注册的BeanDefinition
也可能是一个BeanDefinitionRegistryPostProcessor
,另外一种就只是 BFPP- BFPP 的优先级
使用 applicationContext 直接注册的 > @PriorityOrder > @Order > 普通的
public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPos tProcessor> beanFactoryPostProcessors) { // beanFactory 一般是 DefaultListableBeanFactory, 它确实是一个 BeanDefinitionRegistryif (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; // 常规的 BFPP List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>(); // 能够注册 bean 的 BFPPList<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>(); for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) { BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor; // 调用 postProcessBeanDefinitionRegistry,注册 beanregistryProcessor.postProcessBeanDefinitionRegistry(registry); registryProcessors.add(registryProcessor); } else { regularPostProcessors.add(postProcessor); } } // 从容器中获取所有的 BeanDefinitionRegistryPostProcessorString[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); currentRegistryProcessors.clear(); // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered. postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); currentRegistryProcessors.clear(); // 这里为什么要用 while? 因为 BeanDefinitionRegistryPostProcessor 还有可能注册 BeanDefinitionRegistryPostProcessorsboolean reiterate = true; while (reiterate) { reiterate = false; postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); reiterate = true; } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup()); currentRegistryProcessors.clear(); } // Now, invoke the postProcessBeanFactory callback of all processors handled so far. // 执行 register 的 postProcessorinvokeBeanFactoryPostProcessors(registryProcessors, beanFactory); // 然后执行参数中传过来的 bfpp 的 postProcessor// 注意:这里只处理参数传过来的 BFPPinvokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); } else { // Invoke factory processors registered with the context instance. invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory); } // 下面将会执行容器中所有的 BFPPbeanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); // 1. 标注了 @PriorityOrdered 的 BFPPList<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); // 2. 标注了 @Order 的 BFPPList<String> orderedPostProcessorNames = new ArrayList<>(); // 3. 普通的 BFPPList<String> nonOrderedPostProcessorNames = new ArrayList<>(); for (String ppName : postProcessorNames) { if (processedBeans.contains(ppName)) { // skip - already processed in first phase above } else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class)); } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered. sortPostProcessors(priorityOrderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); // Next, invoke the BeanFactoryPostProcessors that implement Ordered. List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size()); for (String postProcessorName : orderedPostProcessorNames) { orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } sortPostProcessors(orderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); // Finally, invoke all other BeanFactoryPostProcessors. List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size()); for (String postProcessorName : nonOrderedPostProcessorNames) { nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory); // Clear cached merged bean definitions since the post-processors might have // modified the original metadata, e.g. replacing placeholders in values... beanFactory.clearMetadataCache();
}
1.2.6 registerBeanPostProcessors
注册 BPP
优先级@PriorityOrdered > Ordered > 普通的
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {// 获取所有的 BPPString[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);// BPP的数量,这里 +1 是因为下面要加一个int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));// 1. PriorityOrdered 的 BPPList<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();// 2. 内部的 BPPList<BeanPostProcessor> internalPostProcessors = new ArrayList<>();// 3. Ordered 的 BPPList<String> orderedPostProcessorNames = new ArrayList<>();// 4. 普通的 BPPList<String> nonOrderedPostProcessorNames = new ArrayList<>();for (String ppName : postProcessorNames) {if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);priorityOrderedPostProcessors.add(pp);// 实现了 MergedBeanDefinitionPostProcessor 为内部的 BPPif (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {orderedPostProcessorNames.add(ppName);}else {nonOrderedPostProcessorNames.add(ppName);}}// PriorityOrdered 的 BPP 排序sortPostProcessors(priorityOrderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);// Next, register the BeanPostProcessors that implement Ordered.// Ordered 的 BPP 排序List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());for (String ppName : orderedPostProcessorNames) {BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);orderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}sortPostProcessors(orderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, orderedPostProcessors);// 普通的 BPP 排序List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());for (String ppName : nonOrderedPostProcessorNames) {BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);nonOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);// Finally, re-register all internal BeanPostProcessors.sortPostProcessors(internalPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, internalPostProcessors);beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
1.2.7 initApplicationEventMulticaster
初始化事件发布器, 用来发布各种事件
默认对象为SimpleApplicationEventMulticaster
protected void initApplicationEventMulticaster() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();// 如果容器中有了, 使用容器中的if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {this.applicationEventMulticaster =beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);if (logger.isTraceEnabled()) {logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");}}else {// 没有这里创建一个this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);if (logger.isTraceEnabled()) {logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");}}
}
1.2.8 onRefresh
交由子类实现的钩子
1.2.9 registerListeners
注册监听器
protected void registerListeners() {// 1. 获取直接注册到 applicationContext 中的 Listernerfor (ApplicationListener<?> listener : getApplicationListeners()) {getApplicationEventMulticaster().addApplicationListener(listener);}// 2. 获取容器中所有的 ApplicationListenerString[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);for (String listenerBeanName : listenerBeanNames) {getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);}// Publish early application events now that we finally have a multicaster...Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;this.earlyApplicationEvents = null;if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {for (ApplicationEvent earlyEvent : earlyEventsToProcess) {getApplicationEventMulticaster().multicastEvent(earlyEvent);}}
}
1.2.10 finishBeanFactoryInitialization
完成 bean 的初始化, Bean 的创建过程就在这个方法里
内容太多,请查看 1.3 章节
1.2.11 finishRefresh
结束 refresh 方法
protected void finishRefresh() {// 清理缓存clearResourceCaches();// 向容器中添加一个 DefaultLifecycleProcessorinitLifecycleProcessor();// 调用 LifecycleProcessor 的 onRefresh() 方法getLifecycleProcessor().onRefresh();// Publish the final event.publishEvent(new ContextRefreshedEvent(this));// Participate in LiveBeansView MBean, if active.if (!NativeDetector.inNativeImage()) {LiveBeansView.registerApplicationContext(this);}
}
1.3 Bean 的生命周期
1.3.1 入口
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// 。。。// 冻结 BeanFactroy, 就是设置为一个标志位beanFactory.freezeConfiguration();// 实例化 beanbeanFactory.preInstantiateSingletons();
}
1.3.2 preInstantiateSingletons
代码太多了,直接写核心流程
// preInstantiateSingletons()
// 1. 处理 FactoryBean
// 2. 调用 getBean()
1.3.3 doGetBean
// 1. 处理 dependsOn
// 2. 处理单实例 bean, 调用 createBean
// 3. 处理 Prototype Bean
// 4. 处理别的 Scope 的 Bean, 例如 request, Session, 扩展: Nacos 的 @RefreshScope 也是这里处理的
1.3.4 createBean
// 1. 处理方法覆盖
mbdToUse.prepareMethodOverrides();
// 2. 调用 InstantiationAwareBeanPostProcessors 的 applyBeanPostProcessorsBeforeInstantiation() 方
// 2.1 如果这个方法返回了一个Bean, 则说明是我们自主控制了 Bean 的创建, 后续流程将不再执行
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {return bean;
}
// 3. 调用 doCreateBean() 方法创建 Bean
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
1.3.5 doCreateBean
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.BeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}// 创建 Bean 实例// 1. 使用 Supplier 创建// 2. 使用 工厂方法创建// 3. 使用构造器创建if (instanceWrapper == null) {instanceWrapper = createBeanInstance(beanName, mbd, args);}Object bean = instanceWrapper.getWrappedInstance();Class<?> beanType = instanceWrapper.getWrappedClass();// 。。。// 判断是否允许提前暴露对象boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName));if (earlySingletonExposure) {// 添加到三级缓存中// getEarlyBeanReference() 会调用 InstantiationAwareBeanPostProcessor 的 getEarlyBeanReference() 方法// 1. InstantiationAwareBeanPostProcessor 需要注意一个实现类 AbstractAutoProxyCreator, 这个类是用来创建动态代理对象的addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// 对外暴露的对象Object exposedObject = bean;try {// 填充 bean 属性populateBean(beanName, mbd, instanceWrapper);// 初始化 beanexposedObject = initializeBean(beanName, exposedObject, mbd);}// ...// 注册 DisposableBeantry {registerDisposableBeanIfNecessary(beanName, bean, mbd);}/。。。return exposedObject;
}
1.3.6 populateBean
// 1. 执行 InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {return;}}
}
// 2. 处理 BeanDefinition 的 propertyValues
1.3.7 initializeBean 初始化 bean
// 1. 执行 Aware
// 1.1 这里只处理 BeanNameAware,BeanClassLoaderAware,BeanFactoryAware
invokeAwareMethods(beanName, bean);
// 2. 调用 BPP 的 postProcessBeforeInitialization()
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
// 3. 调用初始化方法
// 3.1 InitializingBean 调用 afterPropertiesSet()
// 3.2 调用我们自定义的初始化方法
invokeInitMethods(beanName, wrappedBean, mbd);
// 调用 BPP 的 postProcessAfterInitialization()
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
二、各种 BeanPostProcessor(BPP)
在 Bean 的生命周期中常见的可分为 4 种 BPP,可以查看类
BeanPostProcessorCache
,不同的 BPP 在 Bean 的生命周期的不同时刻执行。
- InstantiationAwareBeanPostProcessor
- SmartInstantiationAwareBeanPostProcessor
- DestructionAwareBeanPostProcessor
- MergedBeanDefinitionPostProcessor
InstantiationAwareBeanPostProcessor
Bean的生命周期中一定是先实例化再初始化。
@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {/*** 实例化之前, 如果这里返回了一个 bean 说明我们需要自主控制 bean 的生命周期* 将不再执行后面的 BPP 和初始化操作*/@Overridepublic Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {return null;}/*** 实例化之后, 只有 before 方法返回的不是一个 null, 才会执行此方法*/@Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {return true;}/*** Bean 执行 afterProperties 的时候调用,可以用来修改属性绑定* 但是这种并不能用来处理解密数据库连接, 因为这个流程太过于前置了, bean 还没有将加密的值绑定上, 这里获取不到加密的值当然无法解密*/@Overridepublic PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {if (bean instanceof BppBean) {MutablePropertyValues mpvs = (pvs instanceof MutablePropertyValues) ?(MutablePropertyValues) pvs : new MutablePropertyValues();// 会将 name 属性值修改为 abcmpvs.add("name", "abc");return mpvs;}return pvs;}/*** 跟上面方法功能一样, 但是这个方法将要被废弃* 如果 postProcessProperties 返回 null, 则会调用这个方法*/@Overridepublic PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {return pvs;}
}
MergedBeanDefinitionPostProcessor
该接口可以用来操作 BeanDefinition
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {}
SmartInstantiationAwareBeanPostProcessor
继承了
InstantiationAwareBeanPostProcessor
@Component
public class MySmartInstantiationAwareBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor {/*** 提前预测 bean 类型* 返回 null 表示不预测*/public Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {if (beanName.equalsIgnoreCase("bppBean")) {return BppBean.class;}return null;}/*** 可以用来指定创建 bean 所用的构造器*/@Overridepublic Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {return SmartInstantiationAwareBeanPostProcessor.super.determineCandidateConstructors(beanClass, beanName);}/*** 如果 bean 从三级缓存中获取对象, 则会调用这个方法*/@Overridepublic Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {return bean;}
}
DestructionAwareBeanPostProcessor
Bean 销毁前执行
@Component
public class MyDestructionAwareBeanPostProcessor implements DestructionAwareBeanPostProcessor {/*** 销毁之前执行*/@Overridepublic void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {System.out.println(beanName + "销毁之前执行");}/*** false 表示不执行销毁*/@Overridepublic boolean requiresDestruction(Object bean) {return false;}
}
总结
博主对源码的理解也很浅显,如有异议,可于评论区留言,欢迎各位大佬指教。
Bean 的生命周期
getBean() -> doGetBean() -> createBean() -> doCreateBean()
1. preInstantiateSingletons
1.1 处理 FactoryBean
1.2 调用 getBean()2. getBean()
2.1 调用 doGetBean()3. doGetBean()
3.1 处理 DependsOn
3.2 获取单实例 Bean 调用 createBean()
3.3 获取多实例 Bean
3.4 处理别的 Scope 类型的Bean, 如 Request,Session4. createBean()
4.1 处理方法覆盖
4.2 调用 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
4.2.1 如果这里返回了一个Bean 将会调用 BeanPostProcessor#postProcessAfterInitialization。
4.2.2 然后后续的流程将不再处理,直接返回4.2.1 返回的 bean
4.3 调用 doCreateBean() 创建 Bean5. doCreateBean()
5.1 调用 `createBeanInstance` 创建 bean
5.1.1 使用 Supplier 创建 Bean
5.1.2 使用工厂方法创建 Bean
5.1.3 使用构造器创建 Bean5.2 调用 populateBean
5.2.1 调用 InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
5.2.2 处理 BeanDefinition 的 PropertyValues5.3 初始化 initializeBean
5.3.1 执行 Aware; BeanNameAware, BeanClassLoaderAware, BeanFactoryAware
5.3.2 执行 BeanPostProcessor#postProcessBeforeInitialization
5.3.3 执行初始化方法 invokeInitMethods()5.4 invokeInitMethods()
5.4.1 如果是 InitializingBean 执行 afterPropertiesSet
5.4.2 执行自定义的初始化方法