AnnotatedBeanDefinitionReader

78 阅读3分钟

1. 前言

xml配置的方式过于繁琐,现在一般更多通过注解或JavaConfig的方式来使用Spring,也就是会用到AnnotationConfigApplicationContext类。在这个类的启动过程中,有一个至关重要的类——AnnotatedBeanDefinitionReader,在它的构造函数里,往DefaultListableBeanFactory中注入了Spring内置的6个非常非常非常重要的BeanDefinition。

2. AnnotatedBeanDefinitionReader

在AnnotationConfigApplicationContext的构造函数里,会创建两个很重要的对象,AnnotatedBeanDefinitionReader顾名思义就是基于注解的BeanDefinition读取器,ClassPathBeanDefinitionScanner是基于ClassPath路径下的BeanDefinition扫描器。

public AnnotationConfigApplicationContext() {

  /**
  * 基于注解的BeanClass读取器,读取完是为了注册到容器中
  * 1.将BeanClass 解析成 AnnotatedGenericBeanDefinition
  * 2.注册BeanDefinition 到 BeanFactory
  */
  this.reader = new AnnotatedBeanDefinitionReader(this);
  /**
  * BeanDefinition扫描器
  * 扫描包路径,得到BeanDefinition Set集合
  */
  this.scanner = new ClassPathBeanDefinitionScanner(this);
}

重点关注AnnotatedBeanDefinitionReader类,它的两大职责:

  • 将基于注解的BeanClass转换为AnnotatedGenericBeanDefinition。
  • 将BeanDefinition注册到DefaultListableBeanFactory里。

它的构造函数很重要:

/**
 * 读取到BeanDefinition是为了完成注册,所以需要registry
 * @param registry BeanDefinition注册器
 * @param environment 环境对象
 */
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
    Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
    Assert.notNull(environment, "Environment must not be null");
    this.registry = registry;
    this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
    // ***关键 注册Spring内置的 BeanPostProcessor 和 BeanFactoryPostProcessor
    AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}

因为Reader读取完BeanDefinition的目的是为了完成注册,所以需要一个注册器BeanDefinitionRegistry。这个注册器其实就是AnnotationConfigApplicationContext里的DefaultListableBeanFactory,说白了就是要把读取到的BeanDefinition注册到BeanFactory。
构造函数里的最后一行代码非常重要,它会向BeanFactory注册Spring内置的非常重要的后置处理器。

public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
    registerAnnotationConfigProcessors(registry, null);
}

它是一个空壳方法,最终调用重载方法:

public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
        BeanDefinitionRegistry registry, @Nullable Object source) {
    // 获取DefaultListableBeanFactory
    DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
    if (beanFactory != null) {
        if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
            // 排序器 支持@Order @Priority
            beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
        }
        if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
            // 依赖注入的候选Bean解析器
            beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
        }
    }
    // 注册的BeanDefinition集合
    Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);

    if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
        /**
         * @see ConfigurationClassPostProcessor
         * 这个类 实现了BeanFactoryPostProcessor 接口
         * 在refresh方法中的 invokeBeanFactoryPostProcessors 时执行,完成BeanDefinition的注册过程
         * 这个后置处理器会扫描 @ComponentScan 路径下的Bean
         */
        RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
        def.setSource(source);
        beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
    }

    if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
        /**
         * @see AutowiredAnnotationBeanPostProcessor
         * 完成依赖注入的后置处理器
         */
        RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
        def.setSource(source);
        beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
    }

    // Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
    if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
        /**
         * @see CommonAnnotationBeanPostProcessor
         * 支持Bean的@PostConstruct@PreDestroy注解的后置处理器
         */
        RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
        def.setSource(source);
        beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
    }

    // Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
    // 针对JPA的支持,可先忽略
    if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
        RootBeanDefinition def = new RootBeanDefinition();
        try {
            def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
                    AnnotationConfigUtils.class.getClassLoader()));
        } catch (ClassNotFoundException ex) {
            throw new IllegalStateException(
                    "Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
        }
        def.setSource(source);
        beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
    }

    if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
        /**
         * @see EventListenerMethodProcessor
         * 支持@EventListener的后置处理器
         */
        RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
        def.setSource(source);
        beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
    }

    if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
        /**
         * @see DefaultEventListenerFactory
         * 将@EventListener方法注册为单个ApplicationListener示例
         */
        RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
        def.setSource(source);
        beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
    }
    return beanDefs;
}

2.1 ConfigurationClassPostProcessor

这个类实现了BeanFactoryPostProcessor接口,用来对BeanFactory进行扩展用的,在AnnotationConfigApplicationContext的refresh()方法中,会调用invokeBeanFactoryPostProcessors()方法调用所有的BeanFactoryPostProcessor扩展,其中就包含这里的ConfigurationClassPostProcessor。
它会完成对@ComponentScan路径下Bean的扫描和注册过程,也就是说,我们自定义的Bean将由这个类完成扫描并注册到BeanFactory中。

2.2 AutowiredAnnotationBeanPostProcessor

Spring的IOC容器,我们只需要声明Bean,Spring会自动帮我们进行依赖注入,这个活就是AutowiredAnnotationBeanPostProcessor干的。它实现了BeanPostProcessor接口,代表要针对Bean进行扩展,依赖注入也属于是针对Bean的一个扩展。

2.3 CommonAnnotationBeanPostProcessor

这个类实现了BeanPostProcessor接口,代表也是针对Bean的扩展点。它还继承了InitDestroyAnnotationBeanPostProcessor类,主要是针对@PostConstruct@PreDestroy@Resource注解的支持。

2.4 PersistenceAnnotationBeanPostProcessor

针对JPA的支持,没太了解,不是很重要,忽略。

2.5 EventListenerMethodProcessor

这个类实现了BeanFactoryPostProcessor接口,代表是针对BeanFactory的扩展点。它主要用来支持@EventListener注解,将EventListener方法注册为单个ApplicationListener实例。

2.6 DefaultEventListenerFactory

这个类没有实现任何PostProcessor,它不算是一个扩展点,主要是配合EventListenerMethodProcessor一起使用,它是一个工厂,用来将EventListener方法生成单个ApplicationListener实例。