AnnotationConfigApplicationContext源代码解析
程序员文章站
2022-03-21 16:34:12
...
一、AnnotationConfigApplicationContext继承结构:
二、主要涉及到的类或接口有以下几个:
-
GenericApplicationContext
——通用应用上下文,内部持有一个DefaultListableBeanFactory
实例,这个类实现了BeanDefinitionRegistry
接口,可以在它身上使用任意的bean definition读取器。典型的使用案例是:通过BeanFactoryRegistry
接口注册bean definitions,然后调用refresh()
方法来初始化那些带有应用上下文语义(org.springframework.context.ApplicationContextAware
)的bean,自动探测org.springframework.beans.factory.config.BeanFactoryPostProcessor
等。关于这两个接口,在介绍bean的生命周期时进行详细讲解。 -
BeanDefinitionRegistry
——用于持有像RootBeanDefinition
和ChildBeanDefinition
实例的bean definitions的注册表接口。DefaultListableBeanFactory
实现了这个接口,因此可以通过相应的方法向beanFactory
里面注册bean。GenericApplicationContext
内置一个DefaultListableBeanFactory
实例,它对这个接口的实现实际上是通过调用这个实例的相应方法实现的。 -
AbstractApplicationContext
——ApplicationContext
接口的抽象实现,没有强制规定配置的存储类型,仅仅实现了通用的上下文功能。这个实现用到了模板方法设计模式,需要具体的子类来实现其抽象方法。自动通过registerBeanPostProcessors()
方法注册BeanFactoryPostProcessor
,BeanPostProcessor
和ApplicationListener
的实例用来探测bean factory里的特殊bean——对比1分析 -
AnnotationConfigRegistry
——注解配置注册表。用于注解配置应用上下文的通用接口,拥有一个注册配置类和扫描配置类的方法。
三、构造方法
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
public AnnotationConfigApplicationContext(DefaultListableBeanFactory beanFactory) {
super(beanFactory);
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
public AnnotationConfigApplicationContext(Class... annotatedClasses) {
this();
this.register(annotatedClasses);
this.refresh();
}
public AnnotationConfigApplicationContext(String... basePackages) {
this();
this.scan(basePackages);
this.refresh();
}
第一个构造器是最基本的无参数构造器,需要通过调用register()方法填充注解类,并进行手动刷新。在这个构造器里初始化了一个读取器和扫描器。第二个构造器能手动指定beanFactory。
第三个构造器能手动指定注解类。
第四个通过指定包名进行自动扫描并刷新。
由于AnnotationConfigApplicationContext是GenericApplicationContext的子类,在调用它的构造器之前会先调用父类的构造器,父类构造器会实例化一个DefaultListableBeanFactory实例,这个就是基于注解配置的应用上下文的IoC容器。SpringBoot默认调用第一个无参数构造器。
上一篇: 实时动态扫描数据流
下一篇: pyplot tutorial (翻译)