从这个简单的代码衍生,使用AnnotationConfigApplicationContext看一下spring bean的初始化过程
public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(Application.class); MessagePrinter printer = context.getBean(MessagePrinter.class); printer.printMessage(); }
设置一个断点,看一下调用过程
bean创建
第一个方法进入AnnotationConfigApplicationContext的构造函数
public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new ClassPathBeanDefinitionScanner(this); }public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { this(); register(annotatedClasses); refresh(); }
Annotation 的类参数结构
this)的构造函数在ApplicationContext(定义了参数)里面,是使用加载BeanDefinition的,使用哪个,就看那个是什么类型的配置参数,是什么类型的使用构造函数。
示例我们的示例阅读器,那就是使用我们的阅读器
public void register(Class<?>... annotatedClasses) { Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified"); this.reader.register(annotatedClasses); }
如果扫描包名,那就是使用
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); } }