从这个简单的代码深入,使用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);
}
}