当前位置: 首页 > news >正文

Spring 核心流程

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

  1. BFPP 主要分为两种,一种是 BeanDefinitionRegistryPostProcessor,这个类可以用来注册 BeanDefinition,而新注册的 BeanDefinition 也可能是一个 BeanDefinitionRegistryPostProcessor,另外一种就只是 BFPP
  2. 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 的生命周期的不同时刻执行。

  1. InstantiationAwareBeanPostProcessor
  2. SmartInstantiationAwareBeanPostProcessor
  3. DestructionAwareBeanPostProcessor
  4. 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 执行自定义的初始化方法
http://www.dtcms.com/a/301057.html

相关文章:

  • 问津集 #2:High Compression and Fast Search on Semi-Structured Logs
  • 网络基础19:OSPF多区域实验
  • 小黑课堂计算机二级 WPS Office题库安装包2.52_Win中文_计算机二级考试_安装教程
  • C++算法竞赛篇(五)循环嵌套题型讲解
  • java开闭原则 open-closed principle
  • 商品中心—1.B端建品和C端缓存
  • 内网服务器实现从公网穿透
  • NVMe高速传输之摆脱XDMA设计16:队列管理模块设计(上)
  • Python 列表推导式与生成器表达式
  • 激光SLAM技术综述(2025版)
  • Python入门构建网页
  • Linux驱动20 --- FFMPEG视频API
  • 基于Django的天气数据可视化分析预测系统
  • Coze:字节跳动AI开发平台功能和架构解析
  • 第五章 中央处理器(CPU)知识体系与考法总结
  • 虚拟机ubuntu20.04共享安装文件夹
  • ubuntu 部署 coze-loop
  • C语言函数递归详解
  • 运行时长和内存优化:混合精度训练(MPT)案例和梯度检查点(GCP)
  • LWGJL教程(6)——GL20源码
  • Python初学OpenCV:图像预处理进阶指南(二)
  • 使用frp实现免费内网穿透
  • 【2025CVPR-扩散模型方向】TKG-DM:免训练的色度关键内容生成扩散模型
  • 区块链:工作量证明与联邦学习
  • ArkTS 模块通信全解析:用事件总线实现页面消息联动
  • rapidocr v3.3.0发布了
  • [10月考试] D
  • 【lucene】MMapDirectory 在FSDirectory基础上干了啥?
  • 链表算法综合——重排链表
  • KNN 算法中的各种距离:从原理到应用