spring bean初始化过程

2021-03-23 10:18:28 浏览数 (1)

从这个简单的代码深入,使用AnnotationConfigApplicationContext看一下spring bean的初始化过程

代码语言:javascript复制
public static void main(String[] args) {
       ApplicationContext context =                new AnnotationConfigApplicationContext(Application.class);
       MessagePrinter printer = context.getBean(MessagePrinter.class);
       printer.printMessage();
   }

设置一个断点,看一下调用过程

bean创建

第一个方法进入AnnotationConfigApplicationContext的构造函数

代码语言:javascript复制
public AnnotationConfigApplicationContext() {		this.reader = new AnnotatedBeanDefinitionReader(this);		this.scanner = new ClassPathBeanDefinitionScanner(this);
}public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {   		this();   		register(annotatedClasses);
  		refresh();
  	}

AnnotationConfigApplicationContext的类结构

在this()的构造函数里面,定义了两个变量,是用来加载BeanDefinition的,具体使用哪个,就看使用的是传入的参数是什么类型就使用哪个构造函数。

比如我们的例子传入的是class,那就使用的reader

代码语言:javascript复制
public void register(Class<?>... annotatedClasses) {
Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");		this.reader.register(annotatedClasses);
}

如果传入的是包名,那就使用的是scanner

代码语言:javascript复制
public void scan(String... basePackages) {		Assert.notEmpty(basePackages, "At least one base package must be specified");
this.scanner.scan(basePackages);	}

看下这儿使用的reader.register()

代码语言:javascript复制
public void register(Class<?>... annotatedClasses) {
for (Class<?> annotatedClass : annotatedClasses) {
registerBean(annotatedClass);
}
}

0 人点赞