当前位置: 代码迷 >> 综合 >> spring启动流程探索三、refresh()(2)invokeBeanFactoryPostProcessors
  详细解决方案

spring启动流程探索三、refresh()(2)invokeBeanFactoryPostProcessors

热度:62   发布时间:2023-11-26 12:05:32.0

spring源码探索三

  • invokeBeanFactoryPostProcessors
    • PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors

invokeBeanFactoryPostProcessors

	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    // 核心方法PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
    beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}}

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors

public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
    // Invoke BeanDefinitionRegistryPostProcessors first, if any.Set<String> processedBeans = new HashSet<>();// 首先执行 BeanDefinitionRegistryPostProcessorsif (beanFactory instanceof BeanDefinitionRegistry) {
    BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;// 常规的PostProcessorsList<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();// 注册类的PostProcessorsList<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();// 处理beanFactory内部的beanFactoryPostProcessors,是 、、 //BeanDefinitionRegistryPostProcessor类型的就加入到registryProcessors 中for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
    if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
    BeanDefinitionRegistryPostProcessor registryProcessor =(BeanDefinitionRegistryPostProcessor) postProcessor;registryProcessor.postProcessBeanDefinitionRegistry(registry);registryProcessors.add(registryProcessor);}else {
    regularPostProcessors.add(postProcessor);}}// 不要在这里初始化FactoryBeans:我们需要保留所有未初始化的beans,以便//bean factory post-processors去调用他们// Do not initialize FactoryBeans here: We need to leave all regular beans// uninitialized to let the bean factory post-processors apply to them!// 将继承了PriorityOrdered,Ordered 的BeanDefinitionRegistryPostProcessors分开// Separate between BeanDefinitionRegistryPostProcessors that implement// PriorityOrdered, Ordered, and the rest.List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.String[] postProcessorNames =// 核心方法一,主要作用是根据type 去工厂拿相应beanName,讲完这个方法整个流程后,再回头细讲这个// 暂时只有org.springframework.context.annotation.internalConfigurationAnnotationProcessorbeanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {
    // 判断ppName对应的bean是不是PriorityOrdered的实现类// 核心方法二isTypeMatch,后面去细讲if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);}}//对 currentRegistryProcessors 排序sortPostProcessors(currentRegistryProcessors, beanFactory);registryProcessors.addAll(currentRegistryProcessors);// 执行postProcessBeanDefinitionRegistry//核心方法三,执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法// 执行这个方法之后,bean工厂会加载其他的注册bean到容器中,这里以后,如果你继承了//BeanDefinitionRegistryPostProcessor,会在这加载进来invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear();// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered. // 这里会加载你的BeanDefinitionRegistryPostProcessors实现类postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {
    // 如果你的实现类继承了Ordered会被加入到currentRegistryProcessors和processedBeansif (!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);currentRegistryProcessors.clear();// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.// 这里逻辑和上述其实差不多,就是区分了一个PriorityOrdered>Ordered>不继承的加载顺序boolean 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);currentRegistryProcessors.clear();}// Now, invoke the postProcessBeanFactory callback of all processors handled so far.// 调用所有给定的processors 的 postProcessBeanFactory// 核心方法四,执行工厂的后置处理器逻辑,后面展开细讲invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);}else {
    // Invoke factory processors registered with the context instance.// 调用注册在上下文的factory processors实例invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);}// Do not initialize FactoryBeans here: We need to leave all regular beans// uninitialized to let the bean factory post-processors apply to them!String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,// Ordered, and the rest.List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();List<String> orderedPostProcessorNames = new ArrayList<>();List<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();}

大家跟着注释看完这整个方法了,其实对这个方法主要作用有了大概的认知了,
他其实就是调用注册在beanFactory的后置处理器,但是对其中的调用先后做了个排序,
大概的总体是这样:
1.先执行继承了BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法(顺序是PriorityOrdered>Ordered>普通)
2.执行继承了BeanDefinitionRegistryPostProcessor.postProcessBeanFactory方法
3.再执行继承了BeanFactoryPostProcessor的postProcessBeanFactory的方法,顺序和上面的一样
4.清除缓存
(1)AbstractBeanFactory.mergedBeanDefinitions
(2)DefaultListableBeanFactory.mergedBeanDefinitionHolders
(3)DefaultListableBeanFactory.allBeanNamesByType
(4)DefaultListableBeanFactory.singletonBeanNamesByType
好,这里大家应该大略了解了这个方法的作用了。我记得我当初面试的时候就是详细的讲了这些,然后补充了一些其他基础知识就把面试官征服了。当时贼开心,也坚定了我坚持看源码的心了。
我接下来给大家细讲下我注释里面标注的四个核心方法:
1.beanFactory.getBeanNamesForType
2.isTypeMatch
3.invokeBeanDefinitionRegistryPostProcessors
4.invokeBeanFactoryPostProcessors
我打算分三个章节来讲,因为这几个方面在spring容器中还是很重要的。先到这里了,谢谢大家的观看,评论加点赞就是对我一直更新的鼓励,我会给大家带来更多的源码解析

  相关解决方案