4-Spring源码解析之this()(1)——AnnotatedBeanDefinitionReader

1. 程序入口

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);

2. AnnotationConfigApplicationContext类有参构造器

其中MainConfig类是自己写的配置类,我们从这一行代码来开始分析。Spring容器先从这一行代码开始来创建AnnotationConfigApplicationContext类型的容器,利用类型构造器来创建对象。下面来看一下这个有参构造器方法执行了哪些操作。

	public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
   
   
		this();  // 1.
		register(annotatedClasses);  // 2.
		refresh(); // 3.
	}

第一行:this();:调用AnnotationConfigApplicationContext的无参构造器
第二行:register(annotatedClasses):对传入的配置类进行预处理与解析
第三行:refresh():容器的创建与刷新

3. AnnotationConfigApplicationContext类的this()方法

3.1 依次调用父类的构造方法

我们先看一下AnnotationConfigApplicationContext类的类结构

4-Spring源码解析之this()(1)——AnnotatedBeanDefinitionReader_第1张图片

由于AnnotationConfigApplicationContext类的父类是GenericApplicationContext类,因此在有参构造器中调用this()时,首先执行父类GenericApplicationContext类的构造器,那么我们先看看GenericApplicationContext类的构造器。

	private final DefaultListableBeanFactory beanFactory;
	public GenericApplicationContext() {
   
   
		this.beanFactory = new DefaultListableBeanFactory();
	}

在这个构造器中,首先初始化一个DefaultListableBeanFactory类型的对象,Spring加载的所有Bean都会放到DefaultListableBeanFactory中

当然DefaultListableBeanFactory类在执行构造方法的时候先调用其父类AbstractBeanFactory的构造器,AbstractBeanFactory在执行构造方法的时候先调用父类DefaultResourceLoader类型的构造器。整个顺序就是上面类图的顺序。

	public AbstractApplicationContext() {
   
   
		this.resourcePatternResolver = getResourcePatternResolver();
	}

    public DefaultResourceLoader() {
   
   
        this.classLoader = ClassUtils.getDefaultClassLoader();
    }
3.2 AnnotationConfigApplicationContext类的this()方法

当父类方法全部调用对应的无参构造器后,我们来返回看AnnotationConfigApplicationContext类的this()方法。

	public AnnotationConfigApplicationContext() {
   
   
		// BeanDefinition读取器. BeanDefinition是描述bean注册的信息
		this.reader = new AnnotatedBeanDefinitionReader(this);
		// 创建BeanDefinition扫描器
		this.scanner = new ClassPathBeanDefinitionScanner(this);
	}

this.reader = new AnnotatedBeanDefinitionReader(this)中,传入的参数为this,而this的类型即当前类的类型,即:AnnotationConfigApplicationContext类型。

3.3 this() 中调用 的AnnotatedBeanDefinitionReader构造器
	public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
   
   
		this(registry, getOrCreateEnvironment(registry));
	}

	private static Environment getOrCreateEnvironment(BeanDefinitionRegistry registry) {
   
   
		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		if (registry instanceof EnvironmentCapable) {
   
   
			return ((EnvironmentCapable) registry).getEnvironment();
		}
		return new StandardEnvironment();
	}

	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;
		this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
		// 注册注解配置的处理器。即项目中我们标注注解的类由下面注册的处理器解析
		// 3.4 分析该方法
		AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
	}

你可能感兴趣的:(Spring注解源码解析,spring)