在Spring启动之后,个人暂时将Spring注入Bean对象的过程分为3个大的步骤,分别是:
Bean的扫描→Bean的实例化→Bean的初始化。
第一步:Bean的扫描
在Spring启动的时候,AnnotationConfigApplicationContext的几种构造参数可以选择使用XML、配置类、包路径来进行扫描
//配置类扫描
ApplicationContext ac=new AnnotationConfigApplicationContext(AppConfig.class);
//配置文件XML扫描
ApplicationContext ac1 =new ClassPathXmlApplicationContext("Spring-rl.xml");
//直接包路径扫描
ApplicationContext ac2 =new AnnotationConfigApplicationContext("com.test");
本文下面以注解类为启动流程
AppConfig.Class 配置类:
package com.asop.app;
import org.springframework.context.annotation.ComponentScan;
/**
* @description:
* @author:19047590
* @date: Created in 2020-05-23 16:56
*/
@ComponentScan("com.asop")
public class AppConfig {
}
启动类:
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(AppConfig.class);
}
}
AnnotationConfigApplicationContext 在启动的时候的构造函数
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
this();
//在初始化的时候,直接将appConfig放入到bdMap中。否则就是不能执行了
//这个方式就用来完成Spring中的初始化需要的一些基本的bd
register(componentClasses);
//Bean的注入
refresh();
}
/**
* Create a new AnnotationConfigApplicationContext that needs to be populated
* through {@link #register} calls and then manually {@linkplain #refresh refreshed}.
*/
public AnnotationConfigApplicationContext() {
//reader 对于外部的beanDefinition进行读取的
//父类的构造方法 创建一个读取注解的Bean定义读取器
this.reader = new AnnotatedBeanDefinitionReader(this);
//可以用来扫描包或者类 然后转化成bd
//实际上扫描包工作的时候不是scanner这个对象完成的
//是Spring自己new一个ClassPathBeanDefinitionScanner
//这里的scanner仅仅是为了能够在外部调用AnnotationConfig
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
因为AnnotationConfigApplicationContext继承了GenericApplicationContext。所以在执行AnnotationConfigApplicationContext的构造函数的时候时候首先执行了GenericApplicationContext的构造函数,创