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.pswp.cn/news/916480.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916480.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916480.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RS485转Profinet网关与JRT激光测距传感器在S7-1200 PLC系统中的技术解析与应用

RS485转Profinet网关与JRT激光测距传感器在S7-1200 PLC系统中的技术解析与应用技术核心&#xff1a;协议转换与数据桥梁在工业自动化系统中&#xff0c;RS485转Profinet网关承担着协议翻译官的角色。以XD-MDPN100型号为例&#xff0c;其本质是将RS485设备的串口数据封装为Profi…

《C++ string 完全指南:string的模拟实现》

string的模拟实现 文章目录string的模拟实现一、浅拷贝和深拷贝1.浅拷贝2.深拷贝3.写时拷贝二、定义string的成员变量三、string的接口实现1.string的默认成员函数&#xff08;1&#xff09;构造函数实现&#xff08;2&#xff09;析构函数实现&#xff08;3&#xff09;拷贝构…

造成服务器内存不足的原因有什么

服务器在日常的运行过程中&#xff0c;会存储大量关于企业重要的数据信息&#xff0c;偶尔会出现内存飙升空间不足的情况&#xff0c;服务器内存作为服务器数据处理和存储的主要空间&#xff0c;异常占用会导致服务器性能降低&#xff0c;影响到企业业务的响应速度&#xff0c;…

JVM、Dalvik、ART垃圾回收机制

一、JVM垃圾回收机制&#xff08;桌面/服务器端&#xff09;1. 核心算法&#xff1a;分代收集新生代回收&#xff08;Minor GC&#xff09;触发条件&#xff1a;Eden区满时触发算法&#xff1a;复制算法&#xff08;Eden → Survivor区&#xff09;过程&#xff1a;存活对象在S…

数学专业转型数据分析竞争力发展报告

一、核心优势拆解&#xff08;1&#xff09;数学能力与数据分析对应关系数学课程数据分析应用场景比较优势说明概率论假设检验设计能准确判断统计显著性阈值实变函数数据质量评估异常值检测的严格性更高线性代数特征工程构建矩阵运算优化模型训练效率&#xff08;2&#xff09;…

JAVA进阶--MySQL

一.MySQL架构连接层:处理客户端连接服务,认证授权相关的操作服务层:最核心的一层&#xff08;核心服务功能&#xff09;,处理sql,包括sql优化,函数调用....存储引擎层:存储引擎是真正负责来操作数据的&#xff08;mysql中数据的存储和提取&#xff09;, mysql中有不同存储引擎,…

【架构】Docker简单认知构建

作为一个之前从来没有接触过Docker的倒霉蛋&#xff0c;想了解学习一下Docker 搜了CSDN和RUNOOB&#xff0c;得到的描述如下&#xff1a; Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包…

C++ std::list概念与使用案例

C std::list 概念详解 std::list 是 C 标准模板库&#xff08;STL&#xff09;中的一个双向链表容器。与 vector 和 array 不同&#xff0c;它不保证元素在内存中连续存储&#xff0c;而是通过指针将各个元素连接起来。 核心特性 双向链表结构&#xff1a; 每个元素包含指向前驱…

从0到1学Pandas(六):Pandas 与数据库交互

目录一、数据库基础操作1.1 连接数据库1.2 执行 SQL 查询1.3 创建与修改表结构二、数据导入导出2.1 从数据库读取数据2.2 将数据写入数据库2.3 大数据量处理三、数据库事务处理3.1 事务概念与实现3.2 批量数据更新3.3 错误处理与回滚四、数据库性能优化4.1 查询性能优化4.2 连接…

GitHub 趋势日报 (2025年07月26日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图602Qwen3-Coder573neko527hrms275BillionMail153Win11Debloat115hyperswitch57data…

机器人仿真(2)Ubuntu24.04下RTX5090配置IsaacSim与IsaacLab

目录 一、前言二、电脑配置三、配置步骤3.1 创建Conda环境3.2 安装PyTorch3.3 安装Isaac Sim3.4 安装Isaac Lab 四、总结 一、前言 博主自从去年开始就一直在关注Isaac Lab和Isaac Sim&#xff0c;但是一直以来由于手头设备只有4060&#xff0c;甚至没有达到最低配置16GB显存要…

DaVinci Resolve 19.0(达芬奇)软件安装包下载及详细安装教程|附带安装文件

[软件名称]&#xff1a;ArcGIS [软件大小]&#xff1a;2.99 GB [系统要求]&#xff1a;支持Win7及更高版本 [下载通道]: 迅雷网盘 [下载链接]:高速下载地址 https://pan.xunlei.com/s/VOW9nw-JV99A_7f_5hhpgqO2A1?pwdbufh# ⚠️:先用手机下载迅雷网盘保存到手机中&#xff0c…

Java学习第八十一部分——Shiro

目录 &#x1f4eb; 一、前言提要简介 &#x1f6e1;️ 二、核心功能介绍 ⚙️ 三、核心架构组件 ☕ 四、与Java的关系 ⚖️ 五、与Spring Security对比 &#x1f9e9; 六、典型应用场景 &#x1f48e; 七、总结归纳概述 &#x1f4eb; 一、前言提要简介 Apache Shiro 是…

虚拟机ubuntu20.04共享安装文件夹

ubuntu20.04共享安装文件夹 4.5 共享安装文件夹 将Windows存放安装文件的文件夹共享给虚拟机&#xff0c;如下图操作&#xff1a;如果是在ubuntu20.04中&#xff0c;还需要以下的操作&#xff1a; sudo mkdir /mnt/hgfs 此命令无效 sudo echo ‘vmhgfs-fuse /mnt/hgfs fu…

如何查看电脑后门IP和流量?

你是否也有以下经历&#xff1f;深夜&#xff0c;你的电脑风扇突然狂转&#xff0c;屏幕却一片寂静&#xff1b;每月流量莫名超标&#xff0c;账单高得离谱&#xff1b;鼠标偶尔不听使唤…这些可能不是电脑“闹脾气”&#xff0c;如何一探究竟&#xff1f; 想象一下&#xff1a…

分类预测 | MATLAB基于四种先进的优化策略改进蜣螂优化算法(IDBO)的SVM多分类预测

分类预测 | MATLAB基于四种先进的优化策略改进蜣螂优化算法(IDBO)的SVM多分类预测 目录分类预测 | MATLAB基于四种先进的优化策略改进蜣螂优化算法(IDBO)的SVM多分类预测分类效果基本介绍多策略量子自适应螺旋搜索算法研究摘要1. 引言1.1 研究背景1.2 研究意义1.3 研究目标2. 文…

Android 修改系统时间源码阅读

链接&#xff1a;XRefAndroid - Support Android 16.0 & OpenHarmony 5.0 (AndroidXRef/AospXRef) 这里看的Android 10的代码&#xff0c;选中Android 10&#xff0c;勾选所有工程&#xff0c;搜索DateTimeSettings‌&#xff1a; 看到showTimePicker应该是显示一个设置时…

关于自定义域和 GitHub Pages(Windows)

GitHub Pages 支持使用自定义域,或将站点 URL 的根目录从默认值(例如 )更改为您拥有的任何域,比如octocat.github.io。 谁可以使用此功能? GitHub Pages 在公共存储库中提供 GitHub Free 和 GitHub Free for organizations,在公共和私有存储库中提供 GitHub Pro、GitHub …

自动驾驶领域中的Python机器学习

数据预处理与特征工程 在自动驾驶系统中&#xff0c;数据是驱动决策的核心。从传感器&#xff08;如摄像头、激光雷达、毫米波雷达&#xff09;收集的原始数据通常包含噪声、缺失值和异常值&#xff0c;需要进行系统的预处理。Python的pandas库提供了强大的数据处理能力&#x…

PROFINET转CAN通讯协议转换速通汽车制造

在汽车系统领域之外&#xff0c;控制器局域网&#xff08;CAN&#xff09;总线技术亦广泛应用于多种工业环境。其固有的稳健性、可靠性与灵活性&#xff0c;使其成为工业自动化及控制系统中设备间通信的理想选择。CAN 总线技术在工业应用中的关键领域包括机器控制、传感器网络以…