从这个简单的代码深入,使用AnnotationConfigApplicationContext看一下spring bean的初始化过程
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
MessagePrinter printer = context.getBean(MessagePrinter.class);
printer.printMessage();
}
设置一个断点,看一下调用过程
第一个方法进入AnnotationConfigApplicationContext的构造函数
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
public void register(Class<?>... annotatedClasses) {
Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified"); this.reader.register(annotatedClasses);
}
如果传入的是包名,那就使用的是scanner
public void scan(String... basePackages) { Assert.notEmpty(basePackages, "At least one base package must be specified");
this.scanner.scan(basePackages); }
看下这儿使用的reader.register()
public void register(Class<?>... annotatedClasses) {
for (Class<?> annotatedClass : annotatedClasses) {
registerBean(annotatedClass);
}
}