1.前言
Spring是一个容器,那么一个容器就有启动和销毁阶段。现在我们要分析的是,Spring在启动的时候做了什么。看源码的时候一点要记住抓大放小
。不要一头扎进去里面的各种逻辑判断,要先从主流程出发,知道每一个步骤的重点是什么(结合我们的使用场景)。这样才不会一脸蒙蔽。因此,本文开始只会阐述大概的流程。
回归正传,下面就正式开始AnnotationConfigApplicationContext
的源码解析。
2.测试类的代码
// @Configuration 是最先解析的
@Configuration
@ComponentScan({"com.spring.lyj","com.spring.lyj.proxy","com.spring.lyj.service"})
public class LyjConfig {}
/** * @author lyj */
public class Test {
public static void main(String[] aargs) {
AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(LyjConfig.class);
ac.refresh(); }
}
测试类的代码非常简单,其实就是配置一个Config类负责扫描对应的包,一个Test.java负责启动类。
3.AnnotationConfigApplicationContext源码解析
这一章主要是解析AnnotationConfigApplicationContext源码解析
在启动的时候是做了什么。
3.1 AnnotationConfigApplicationContext的类结构
AnnotationConfigApplicationContext
继承了GenericApplicationContext
类和实现了
AnnotationConfigRegistry
接口。因此,作为子类和实现类,也拥有了他们的功能。下面总结了他们的作用:
-
GenericApplicationContext:作为
AnnotationConfigApplicationContext
的父类,在子类new的时候,会调用父类的构造方法,GenericApplicationContext
在构造方法会new一个工厂对象。这个DefaultListableBeanFactory
是创建Bean的工厂,里面有一些比较重要的属性。比如说:beanDefinitionMap等。
-
AnnotationConfigRegistry:注册接口,提供了两个方法,register和scan,前者负责把一个类注册到Spring容器中,后者负责扫描指定的包路径下的类。
3.2 AnnotationConfigApplicationContext构造方法
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
// 这里调用的是无参构造方法,因此我们直接无参构造方法做了什么
this();
// 这里就是将我们的LyjConfig.class作为一个Bean注册到Bean工厂中
// 这里我们一路追踪的话 最终会找到这么一行代码(详情代码需要读者自己去看,这里只是贴出最终的用的方法) DefaultListableBeanFactory#registerBeanDefinition
this.register(annotatedClasses);
this.refresh();
}
// 无参构造方法
public AnnotationConfigApplicationContext() {
// 这里通过委托模式,最终调用的是AnnotationConfigUtils#registerAnnotationConfigProcessors,
// 感兴趣的读者可以自己Ctrl+鼠标左键去一路追踪
// 他会创建几个重要的Bean,然后放到BeanMap中
this.reader = new AnnotatedBeanDefinitionReader(this);
// 这个scanner没什么用,Spring扫描的时候不用的不是这个scanner,可以先行过滤不用在意
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
比较重要的BeanDefinition如下图:
- ConfigurationClassPostProcessor(非常重要!):当spring容器启动的时候会去调用ConfigurationClassPostProcessor这个bean工厂的后置处理器完成扫描;
- AutowiredAnnotationBeanPostProcessor:这个其实就是负责处理我们平时写代码的时候加上
@Autowired
的后置处理器; - CommonAnnotationBeanPostProcessor:这个则是处理
@Resource
的后置处理器。 - EventListenerMethodProcessor:目前这个现在还没去研究,如果单纯看名字的话,是事件监听的处理器的后置处理器
3.3 AnnotationConfigApplicationContext总结
DefaultListableBeanFactory
,就是我们说的Bean工厂,负责保存我们创建Bean所需要的信息。AnnotatedBeanDefinitionReader
,一个读取器,可以显示地注册我们的Bean;完成对
ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、EventListenerMethodProcessor的配置。