spring 源码解析 AnnotationConfigApplicationContext方式启动容器

本文深入探讨了Spring的`AnnotationConfigApplicationContext`构造方法,分析了其在空参构造时如何通过`AnnotatedBeanDefinitionReader`和`ClassPathBeanDefinitionScanner`初始化。同时,详细讲解了`AnnotatedBeanDefinitionReader`的初始化过程,包括注册后置处理器的步骤,以及`ClassPathBeanDefinitionScanner`的构造和默认过滤器的注册。
摘要由CSDN通过智能技术生成
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

看看AnnotationConfigApplicationContext类的构造方法都干了什么

	/**
	 * 容器启动 传入配置类class数组
	 */
	public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
		//调用空参构造
		this(); 
		//将参数bean注册到容器中
		register(componentClasses);
		//刷新容器
		refresh();
	}

1.空参构造

	/**
	 * 空参构造
	 */
	public AnnotationConfigApplicationContext() {
		this.reader = new AnnotatedBeanDefinitionReader(this);
		this.scanner = new ClassPathBeanDefinitionScanner(this);
	}

这里实例化了一个AnnotatedBeanDefinitionReader和一个ClassPathBeanDefinitionScanner。他们的构造方法如下:

	/**
	 * 根据BeanDefinitionRegistry构造一个AnnotatedBeanDefinitionReader
	 */
	public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
		this(registry, getOrCreateEnvironment(registry));
	}



	/**
	 * 根据BeanDefinitionRegistry构建ClassPathBeanDefinitionScanner
	 */
	public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry) {
		this(registry, true);
	}

可以看到这里传入的是一个BeanDefinitionRegistry,而AnnotationConfigApplicationContext在创建这两个对象的时候传入的是this,也就是AnnotationConfigApplicationContext对象,我们看一下这个类的定义

public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry {}


public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry {}

发现其父类GenericApplicationContext实现了BeanDefinitionRegistry接口,所以这里能够直接用this来构造出AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner对象。附图:

2.AnnotatedBeanDefinitionReader初始化时都干了什么

	/**
	 * 根据BeanDefinitionRegistry构造一个AnnotatedBeanDefinitionReader
	 */
	public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
		this(registry, getOrCreateEnvironment(registry));
	}

这里的构造方法是直接调用的另一个构造方法,我们先看一下getOrCreateEnvironment做了什么

	/**
	 * 根据BeanDefini
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值