Spring源码:AnnotationConfigApplicationContext启动的时候做了什么

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的类结构

AnnotationConfigApplicationContext继承了GenericApplicationContext类和实现了
AnnotationConfigRegistry接口。因此,作为子类和实现类,也拥有了他们的功能。下面总结了他们的作用:

  • GenericApplicationContext:作为AnnotationConfigApplicationContext的父类,在子类new的时候,会调用父类的构造方法,GenericApplicationContext在构造方法会new一个工厂对象。这个DefaultListableBeanFactory是创建Bean的工厂,里面有一些比较重要的属性。比如说:beanDefinitionMap等。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-su1WpkjW-1631602263599)(en-resource://database/1159:1)]

  • 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总结
  1. DefaultListableBeanFactory,就是我们说的Bean工厂,负责保存我们创建Bean所需要的信息。
  2. AnnotatedBeanDefinitionReader,一个读取器,可以显示地注册我们的Bean;完成对
    ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、EventListenerMethodProcessor的配置。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值