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实例。