spring源码-invokeBeanFactoryPostPr

2023-01-02  本文已影响0人  王侦

在这两个方法执行之前,已经做了如下操作:

1.invokeBeanFactoryPostProcessors()

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class);
context.addBeanFactoryPostProcessor(new XXXBeanFactoryPostProcessor);
contest.refresh();
    public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() {
        return this.beanFactoryPostProcessors;
    }

这里this.beanFactoryPostProcessors就是通过context.addBeanFactoryPostProcessor()手动添加的,如果没有添加,就为空。

invokeBeanFactoryPostProcessors()执行流程:

1.1 ConfigurationClassPostProcessor

1.1.1 processConfigBeanDefinitions()

执行流程:

BeanDefinition的覆盖问题:

1.1.2 postProcessBeanFactory()

处理流程:

这里代理类的增强逻辑是:

    private static final Callback[] CALLBACKS = new Callback[] {
            new BeanMethodInterceptor(),
            new BeanFactoryAwareMethodInterceptor(),
            NoOp.INSTANCE
    };

核心是BeanMethodInterceptor,这里会进行处理下面的问题。

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        System.out.println(orderService());
        System.out.println(orderService());
        return new UserService();
    }

    @Bean
    public OrderService orderService() {
        return new OrderService();
    }
}

这里主要解决的就是上面的这种问题,就是上面的orderService()返回的是同一个对象还是不同对象?如果是Full配置类,则返回的是相同对象,如果不是Full配置类,则返回的是不同的对象。

这里的orderService()除了上面在userService()中调用,还在创建@Bean的单例时会调用。

2.registerBeanPostProcessors()

上面的步骤完成了扫描(这个过程中会扫描出程序员可自己定义的BeanPostProcessor),在这一步就会把BeanFactory中所有的BeanPostProcessor找出来并实例化得到一个对象,并添加到BeanFactory中去(属性beanPostProcessors),最后再重新添加一个ApplicationListenerDetector对象(之前其实就添加了过,这里是为了把ApplicationListenerDetector移动到最后)。

步骤:

MergedBeanDefinitionPostProcessor表示系统内部的BeanPostProcessor,比如AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor就实现了该接口。

上一篇 下一篇

猜你喜欢

热点阅读