1.AnnotationConfigApplicationContext的作用
在编写Springdemo的时候我们经常new 一个AnnotationConfigApplicationContext,接下来我们跟一下源码查看具体在哪一步容器扫描了我们自定义的Bean
2.入口及配置类代码如下
- 配置类
@Configuration
@ComponentScan("com.hgy")
public class MyConfig {
}
- 入口代码
public class Entry {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
}
}
3.用Debug方式进行调试
3.1进入构造方法
3.2注意事项
- 注意进入到此处实际上AnnotationConfigApplicationContext的父类构造方法已经执行
- AnnotationConfigApplicationContext的继承结构图如下
- 父类执行的构造方法如下
- 此处相当于实列化了一个BeanFactory,可以用来存储Bean的描述信息(BeanDefinition)
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
3.3 进入this()构造方法
- 此处我们可以发现实列化了Reader和Scanner具体解释如下, 我们主要看AnnotatedBeanDefinitionReader里面做了什么
public AnnotationConfigApplicationContext() {
//创建一个读取注解形式的BeanDefinition读取器,参数是一个Bean定义描述注册器
//1. 在此处向BeanDefinition中注册了6个注解处理器
//2. 此处初始化了系统属性以及环境变量
this.reader = new AnnotatedBeanDefinitionReader(this);
//1.注册了注解过滤器
//2.这个scanner不会被使用(spring的扫描并不是这个类来完成的),除非调用了this.scan();方法
//spring中是在上面的代码里自己new 了一个ClassPathBeanDefinitionScanner
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
- 点击进入构造,然后在继续点击进入具体的构造方法如下
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;
//主要用于判断Conditional注解的
this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
//此处的registry就是spring的ApplicationContext实列,也是BeanDefinitionRegistry
//在此处还向BeanDefinition中注册了6个注解处理器
//org.springframework.context.annotation.internalConfigurationAnnotationProcessor
//org.springframework.context.annotation.internalAutowiredAnnotationProcessor
//org.springframework.context.annotation.internalRequiredAnnotationProcessor
//org.springframework.context.annotation.internalCommonAnnotationProcessor
//org.springframework.context.event.internalEventListenerProcessor
//org.springframework.context.event.internalEventListenerFactory
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}
- 在最后一行代码,进入registerAnnotationConfigProcessors的具体实现
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
BeanDefinitionRegistry registry, @Nullable Object source) {
//转换类型为DefaultListableBeanFactory
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
if (beanFactory != null) {
if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
}
if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
}
}
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(4);
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));
}
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));
}
if (!registry.containsBeanDefinition(REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(RequiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
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));
}
// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
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)) {
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)) {
RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
}
return beanDefs;
}
3.3重点
-
在以上代码中我们可以发现spring注入几个BeanDefinition,一共注入了6个BeanDefinition
//org.springframework.context.annotation.internalConfigurationAnnotationProcessor //org.springframework.context.annotation.internalAutowiredAnnotationProcessor //org.springframework.context.annotation.internalRequiredAnnotationProcessor //org.springframework.context.annotation.internalCommonAnnotationProcessor //org.springframework.context.event.internalEventListenerProcessor //org.springframework.context.event.internalEventListenerFactory
- 其中最重要的BeanDefinition是ConfigurationAnnotationProcessor,此处我给出哪的继承关系
3.4以上是Reader的初始化比较重要的过程,接下来回到AnnotationConfigApplicationContext的构造方法
3.5进入refresh方法
- 走到invokeBeanFactoryPostProcessors方法,此处马上执行刚刚注册ConfigurationAnnotationProcessor,因为ConfigurationAnnotationProcessor他就是一个BeanFactoryPostProcessor的实现
- 进入方法中查看具体实现,进入invokeBeanFactoryPostProcessors方法中
- 走到invokeBeanDefinitionRegistryPostProcessors方法调用处
- 进入方法找到postProcessBeanDefinitionRegistry
- 找到图中的方法调用
- 进入方法当循环到我们自定义的配置Bean时停下,如图
- 下方316行也就是解析配置Bean的地方
- 继续执行代码并进入方法,到parse方法中,此处任然没有开始真正的解析只是判断当前的Bd是什么类型
- 配置Bean是在构造方法中的register(MyConfig.class)中注入到BdMap中的,继续进入方法直到processConfigurationClass方法中
- 在此处对Bd进行了包装,然后进行真正的解析
- 此处也就是真正解析我们配置类的时候。如图