spring的核心方法只之invokeBeanFactoryPostProcessors

invokeBeanFactoryPostProcessors就是将项目中的BeanDefinition加载进beanDefinitionMap中,并且对BeanFactoryPostProcess的实现类进行回调的地方。

先往spring容器中加入四个扩展类,便于下面演示。

HandFactoryPostProcessor: 手动的往spring容器中加入的BeanFactoryPostProcessor的实现类

public class HandFactoryPostProcessor implements BeanFactoryPostProcessor {
	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		System.out.println("HandFactoryPostProcessor ---> postProcessBeanFactory");
	}
}

HandRegisterPostProcessor:手动的往spring容器中加入的BeanDefinitionRegistryPostProcessor的实现类

public class HandRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		System.out.println("HandRegisterPostProcessor ---> postProcessBeanDefinitionRegistry");
	}

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		System.out.println("HandRegisterPostProcessor ---> postProcessBeanFactory");
	}
}

ScanFactoryPostProcessor:通过注解的方式往spring容器中加入的BeanFactoryPostProcessor的实现类

@Component
public class ScanFactoryPostProcessor implements BeanFactoryPostProcessor {
	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		System.out.println("ScanFactoryPostProcessor ---> postProcessBeanFactory");
	}
}

ScanRegisterPostProcessor:通过注解的方式往spring容器中加入的BeanDefinitionRegistryPostProcessor的实现类

@Component
public class ScanRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		System.out.println("ScanRegisterPostProcessor ---> postProcessBeanDefinitionRegistry");
	}

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		System.out.println("ScanRegisterPostProcessor ---> postProcessBeanFactory");
	}
}

这里说的程序员手动加入是指,在执行spring容器的refresh方法之前就,通过调用容器的接口,手动的往容器中加入BeanDefinitionRegistryPostProcessor接口的实现类的做法,代码如下。

AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext();
// 手动加入HandFactoryPostProcessor和HandRegisterPostProcessor
ioc.addBeanFactoryPostProcessor(new HandFactoryPostProcessor());
ioc.addBeanFactoryPostProcessor(new HandRegisterPostProcessor());
ioc.register(AppConfig.class);
ioc.refresh();

invokeBeanFactoryPostProcessors方法的执行主要包括一下几个部分:

  • 执行程序员手动加入到容器中的BeanDefinitionRegistryPostProcessor接口的实现类。

    源码如下:

    for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
        if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
            BeanDefinitionRegistryPostProcessor registryProcessor =
                (BeanDefinitionRegistryPostProcessor) postProcessor;
            // 此处即为执行手动加入到容器中的BeanDefinitionRegistryPostProcessor接口的实现类。
            registryProcessor.postProcessBeanDefinitionRegistry(registry);
            registryProcessors.add(registryProcessor);
        }
        else {
            // 只实现BeanFactoryPostProcessor接口的扩展接口
            regularPostProcessors.add(postProcessor);
        }
    }
    

    运行完上述源码的控制台结果如下:

    执行了通过手动方式加入到容器中的BeanDefinitionRegistryPostProcessor接口的实现类


  • 调用实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的扩展类

    ps:在这一步所执行的扩展类可以是spring自带的扩展类或是程序员往程序中加入的,平时主要是执行spring自带的扩展类比如ConfigurationClassPostProcessor:用于解析往spring容器中注入BeanDefinition的注解@Configuration, @Bean, @Service, @Component, @Repository, @Import等。

    源代码如下:

    // Do not initialize FactoryBeans here: We need to leave all regular beans
    // uninitialized to let the bean factory post-processors apply to them!
    // Separate between BeanDefinitionRegistryPostProcessors that implement
    // PriorityOrdered, Ordered, and the rest.
    List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
    
    // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
    String[] 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);
    // 为了之后可以不用再去找父类,因为现在实现完BeanDefinitionRegistryPostProcessor中的方法之后,后面还需要用到这个扩展类
    registryProcessors.addAll(currentRegistryProcessors);
    /**
     * 执行实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的扩展类
     */
    invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    currentRegistryProcessors.clear();
    

    运行到此阶段执行的BeanDefinitionRegistryPostProcessor扩展类如下:

  • 调用实现了Ordered接口的BeanDefinitionRegistryPostProcessor的扩展类。

    源码如下:

    // 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);
    currentRegistryProcessors.clear();
    

    执行逻辑与调用实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的扩展类类似。


  • 调用没有实现PriorityOrderedOrdered接口BeanDefinitionRegistryPostProcessor的扩展类。(这一步执行完之后BeanDefinitionRegistryPostProcessor的扩展类都执行完了)

    源码如下:

    // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
    boolean reiterate = true;
    while (reiterate) {
        reiterate = false;
        postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
        for (String ppName : postProcessorNames) {
            if (!processedBeans.contains(ppName)) {
                // 找到剩下来的那些还没有被执行过的BeanDefinitionRegistryPostProcessor
                currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                processedBeans.add(ppName);
                reiterate = true;
            }
        }
        sortPostProcessors(currentRegistryProcessors, beanFactory);
        registryProcessors.addAll(currentRegistryProcessors);
        // 到此为止所有的BeanDefinitionRegistryPostProcessor中的扩展口都被执行过了
        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
        currentRegistryProcessors.clear();
    }
    

    这里调用的BeanDefinitionRegistryPostProcessor接口的实现类如下:

    执行结果:


  • 调用BeanDefinitionRegistryPostProcessor的父类方法(因为BeanDefinitionRegistryPostProcessor接口也是继承了BeanFactoryPostProcessor接口,所以BeanDefinitionRegistryPostProcessor的父类方法就是指的扩展类中的postProcessBeanFactory方法)

    源码如下:

    // registryProcessors 为 List<BeanDefinitionRegistryPostProcessor>,是之前调用的所有的BeanDefinitionRegistryPostProcessor接口的实现类。
    invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
    

    执行结果是:

  • 调用程序员手动加入到容器中的BeanFactoryPostProcessors的扩展类。

    源码如下:

    // regularPostProcessors,为先前手动加入到spring容器中的BeanFactoryPostProcessors接口的实现类
    invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    

    执行结果:


  • 调用实现了PriorityOrdered接口的BeanFactoryPostProcessors的扩展类。

    源码如下:

    // 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);
    

    和上述执行实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的扩展类逻辑一致。


  • 调用实现了Ordered接口的BeanFactoryPostProcessors的扩展类。

    源码如下:

    		// 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);
    

  • 调用没有实现PriorityOrderedOrdered接口的BeanFactoryPostProcessors的扩展类。

    源码如下:

    // 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);
    

    执行结果:

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring核心容器是Spring框架中最核心的部分,提供了管理和组织应用程序中组件的功能。它包含了一系列的模块,如文本、图片等各种资源文件,同时提供了应用程序所需的各种组件,如BeanFactory、ApplicationContext等。 首先,Spring核心容器提供了BeanFactory接口,用于对Java对象(也即Bean)进行管理和配置的工厂。通过配置文件或注解的方式,我们可以定义Bean的属性和依赖关系,从而使用容器来获取已经创建好的Bean实例。BeanFactory接口负责创建和管理这些Bean,同时也负责销毁它们。 其次,Spring核心容器还提供了ApplicationContext接口,它是BeanFactory的子接口,提供了更多的功能。ApplicationContext可以从多种来源(比如文件系统、数据库、网络等)加载配置信息,并管理Bean的生命周期。除了BeanFactory的所有功能,ApplicationContext还支持国际化、事件发布、资源管理等更高级的功能。 另外,Spring核心容器还包括了一些辅助模块,如AOP(面向切面编程)、ORM(对象关系映射)等。这些模块可以与核心容器无缝集成,提供更强大、更灵活的功能。例如,通过AOP,我们可以在不修改原有代码的情况下,为应用程序添加事务、日志等横切关注点。而通过ORM,我们可以方便地将Java对象映射到数据库中的表。 总结来说,Spring核心容器是Spring框架最为重要的组成部分,它提供了BeanFactory和ApplicationContext两个接口,用于管理和组织应用程序中的组件。同时,它还包括了一些辅助模块,如AOP和ORM,以提供更多的功能支持。使用Spring核心容器,我们可以简化应用程序的开发、配置和管理,提高代码的可重用性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值