目录
[registerBeanDefinition(String name, BeanDefinition beanDefinition)方法](#registerBeanDefinition(String name, BeanDefinition beanDefinition)方法)
[registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, Object source)方法](#registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, Object source)方法)
[registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)方法](#registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)方法)
ConfigurationClassPostProcessor
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
[register(Class ... componentClasses)方法](#register(Class ... componentClasses)方法)
使用AnnotationConfigApplicationContext容器进行测试看下效果
自定义一个实现了BeanDefinitionRegistryPostProcessor的组件类
上一章回顾
主要讲述的是BeanDefinition,意为Bean的定义信息,记录了Bean是否为单例、是否懒加载等信息,Spring先将需要管理的Bean所对应的BeanDefinition信息存储起来,然后再进行后续操作,如:BeanFactoryPostProcessor的实例化和回调、Bean的实例化、BeanPostProcessor的before方法回调、Bean的初始化、BeanPostProcessor的after方法回调等。
前置知识
DefaultListableBeanFactory
beanDefinitionMap属性
java
// 用于存放容器中的Bean定义信息
// key:beanName
// value:BeanDefinition对象
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
beanDefinitionNames属性
java
// bean名字的集合
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
registerBeanDefinition(String name, BeanDefinition beanDefinition)方法
java
/**
* 对BeanDefinitionRegistry接口中的registerBeanDefinition方法的实现
*/
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {
// ...
// 往容器中添加BeanDefinition信息
this.beanDefinitionMap.put(beanName, beanDefinition);
this.beanDefinitionNames.add(beanName);
// ...
}
AnnotationConfigUtils
部分常量
java
// 容器内部组件Bean:ConfigurationClassPostProcessor的beanName
public static final String CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME =
"org.springframework.context.annotation.internalConfigurationAnnotationProcessor";
// 容器内部组件Bean:AutowiredAnnotationBeanPostProcessor的beanName
public static final String AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME =
"org.springframework.context.annotation.internalAutowiredAnnotationProcessor";
// 容器内部组件Bean:CommonAnnotationBeanPostProcessor的beanName
public static final String COMMON_ANNOTATION_PROCESSOR_BEAN_NAME =
"org.springframework.context.annotation.internalCommonAnnotationProcessor";
// 容器内部组件Bean:EventListenerMethodProcessor的beanName
public static final String EVENT_LISTENER_PROCESSOR_BEAN_NAME =
"org.springframework.context.event.internalEventListenerProcessor";
// 容器内部组件Bean:DefaultEventListenerFactory的beanName
public static final String EVENT_LISTENER_FACTORY_BEAN_NAME =
"org.springframework.context.event.internalEventListenerFactory";
registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, Object source)方法
java
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
BeanDefinitionRegistry registry, @Nullable Object source) {
// 获取DefaultListableBeanFactory对象
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
// 添加ConfigurationClassPostProcessor组件Bean的RootBeanDefinition到容器中
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 添加AutowiredAnnotationBeanPostProcessor组件Bean的RootBeanDefinition到容器中
if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 添加CommonAnnotationBeanPostProcessor组件Bean的RootBeanDefinition到容器中
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 添加EventListenerMethodProcessor组件Bean的RootBeanDefinition到容器中
if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
}
// 添加DefaultEventListenerFactory组件Bean的RootBeanDefinition到容器中
if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
}
return beanDefs;
}
// 这里的registry是DefaultListableBeanFactory
private static BeanDefinitionHolder registerPostProcessor(
BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {
// ...
// 将BeanDefinition添加到容器中,也就是DefaultListableBeanFactory的beanDefinitionMap集合中
registry.registerBeanDefinition(beanName, definition);
// ...
}
BeanDefinitionReaderUtils
registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)方法
java
public abstract class BeanDefinitionReaderUtils {
// ...
public static void registerBeanDefinition(
BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
throws BeanDefinitionStoreException {
// 获取beanName
String beanName = definitionHolder.getBeanName();
// 将BeanDefinition添加到Spring容器中
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
// 处理bean的别名
String[] aliases = definitionHolder.getAliases();
if (aliases != null) {
for (String alias : aliases) {
registry.registerAlias(beanName, alias);
}
}
}
// ...
}
这里先简单说下部分内部组件Bean的作用
ConfigurationClassPostProcessor
- 识别@ComponentScan注解
- 识别@Component注解
- 识别@Configuration注解
- 识别@Bean注解
- 识别@Import注解
- ......
AutowiredAnnotationBeanPostProcessor
- 识别@Autowired注解
- 识别@Value注解
- ......
CommonAnnotationBeanPostProcessor
- 识别@Resource注解
- 识别@PostConstruct注解
- 识别@PreDestroy注解
- ......
AnnotatedBeanDefinitionReader
构造器
java
public class AnnotatedBeanDefinitionReader {
// ...
// 参数可以理解为Spring容器
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
// 调用两个参数的构造器
this(registry, getOrCreateEnvironment(registry));
}
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
// ...
// 前置知识中提到的工具类
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}
// ...
}
public abstract class AnnotationConfigUtils {
// ...
public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
// 这里调用的是前置知识中提到的AnnotationConfigUtils类的方法
// 将Spring内部需要的组件Bean的BeanDefinition信息存放到BeanDefinitionMap集合中
registerAnnotationConfigProcessors(registry, null);
}
// ...
}
register(Class<?>... componentClasses)方法
java
public class AnnotatedBeanDefinitionReader {
// ...
// 可以传入多个用户定义的组件类
public void register(Class<?>... componentClasses) {
// 遍历传入的组件类
for (Class<?> componentClass : componentClasses) {
registerBean(componentClass);
}
}
public void registerBean(Class<?> beanClass) {
doRegisterBean(beanClass, null, null, null, null);
}
private <T> void doRegisterBean(Class<T> beanClass, @Nullable String name,
@Nullable Class<? extends Annotation>[] qualifiers, @Nullable Supplier<T> supplier,
@Nullable BeanDefinitionCustomizer[] customizers) {
// 用户自定义的组件类对应创建AnnotatedGenericBeanDefinition对象
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);
// ...
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
// 使用前置知识中介绍的工具类添加BeanDefinition到Spring容器中
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
}
// ...
}
使用AnnotationConfigApplicationContext容器进行测试看下效果
自定义一个组件类
java
package bean.definition.test;
import org.springframework.context.annotation.ComponentScan;
/**
* 自定义的组件类,添加了@ComponentScan注解
*/
@ComponentScan("bean.definition.test")
public class CustomComponent {
}
自定义一个实现了BeanDefinitionRegistryPostProcessor的组件类
java
package bean.definition.test;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// 从容器中获取所有的BeanDefinition的beanName
String[] beanDefinitionNames = registry.getBeanDefinitionNames();
// 遍历查看
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
编写测试类
java
package bean.definition.test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringBeanDefinitionTest {
public static void main(String[] args) {
// 1、执行AnnotatedBeanDefinitionReader实例化
// 2、执行ClassPathBeanDefinitionScanner实例化
// 3、调用AnnotatedBeanDefinitionReader的register方法将传入的组件类的Bean定义对象添加到容器中
// 4、执行AbstractApplicationContext的refresh方法
new AnnotationConfigApplicationContext(CustomComponent.class);
}
}
运行结果
java
// 5个Spring内部组件beanName(internal)
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
// 2个用户自定义组件beanName
customComponent
customBeanDefinitionRegistryPostProcessor
调试程序,看容器中的beanDefinitionMap集合

