AnnotationConfigApplicationContext源代码解析

原创 2018年04月17日 16:10:57

一、AnnotationConfigApplicationContext继承结构:


二、主要涉及到的类或接口有以下几个:

  1. GenericApplicationContext——通用应用上下文,内部持有一个DefaultListableBeanFactory实例,这个类实现了BeanDefinitionRegistry接口,可以在它身上使用任意的bean definition读取器。典型的使用案例是:通过BeanFactoryRegistry接口注册bean definitions,然后调用refresh()方法来初始化那些带有应用上下文语义(org.springframework.context.ApplicationContextAware)的bean,自动探测org.springframework.beans.factory.config.BeanFactoryPostProcessor等。关于这两个接口,在介绍bean的生命周期时进行详细讲解。
  2. BeanDefinitionRegistry——用于持有像RootBeanDefinition和 ChildBeanDefinition实例的bean definitions的注册表接口。DefaultListableBeanFactory实现了这个接口,因此可以通过相应的方法向beanFactory里面注册bean。GenericApplicationContext内置一个DefaultListableBeanFactory实例,它对这个接口的实现实际上是通过调用这个实例的相应方法实现的
  3. AbstractApplicationContext——ApplicationContext接口的抽象实现,没有强制规定配置的存储类型,仅仅实现了通用的上下文功能。这个实现用到了模板方法设计模式,需要具体的子类来实现其抽象方法。自动通过registerBeanPostProcessors()方法注册BeanFactoryPostProcessorBeanPostProcessorApplicationListener的实例用来探测bean factory里的特殊bean——对比1分析
  4. 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默认调用第一个无参数构造器。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tuoni123/article/details/79976105

AnnotationConfigApplicationContext的实例化过程

1,类继承结构 理解AnnotationConfigApplicationContext的实例化过程之前先看一下它的类继承结构: 主要涉及到的类或接口有以下几个: GenericAppli...
  • chr1sgong
  • chr1sgong
  • 2018-01-17 12:02:10
  • 787

AnnotationConfigApplicationContext的register方法

public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext a...
  • maoliangfei2011
  • maoliangfei2011
  • 2017-06-15 11:36:48
  • 1029

第一篇:Configuration-basic 之Spring对注解的处理【AnnotationConfigApplicationContext 】深度剖析

参考文章:http://blog.csdn.net/chjttony/article/details/6301523  IBM中国开发者社区:http://www.ibm.com/developer...
  • ilovejava_2010
  • ilovejava_2010
  • 2012-07-26 00:04:51
  • 4698

spring注解开发AnnotationConfigApplicationContext的使用

使用AnnotationConfigApplicationContext可以实现基于Java的配置类加载Spring的应用上下文.避免使用application.xml进行配置。在使用spring框架...
  • lzx1037922850
  • lzx1037922850
  • 2016-12-16 16:33:27
  • 7049

基于Java的Spring容器配置一(AnnotationConfigApplicationContext实例化Spring容器)

基本概念: Spring的新Java配置支持@Configuration注解与@Bean注解 @Configuration表示类可以使用Spring Ioc容器作为bean的定义的来源类似于,而@...
  • u011559544
  • u011559544
  • 2017-10-10 00:17:24
  • 174

ApplicationContext——类注解的配置方式

ApplicationContext 类注解
  • m0_37105443
  • m0_37105443
  • 2017-04-16 01:02:45
  • 1744

第一个完全注解使用aop例子(不使用配置)

1.spring 3.0 增加了---->AnnotationConfigApplicationContext初始化容器方法(之前我们常用Applicationcontext 这个摆脱不了xml配置)...
  • IT_COOKIE_SAM
  • IT_COOKIE_SAM
  • 2017-02-23 17:42:28
  • 318

annotation方式实现spring aop

AOP 面向切面编程 AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:1、定义普通业务组件2、定义切入点,一个切入点可能横切多个业务组件3、定义增强处理,增强处理就是在AOP...
  • crazyzhb2012
  • crazyzhb2012
  • 2016-12-12 09:37:59
  • 229

Spring(18)——使用Java类的形式配置bean(二)

18.2 @Configuration@Configuration是标注在Class上的,当我们需要基于Java类的形式对Spring进行配置时,我们就需要在对应的配置类上使用@Configurati...
  • elim168
  • elim168
  • 2017-08-14 10:43:58
  • 2603
收藏助手
不良信息举报
您举报文章:AnnotationConfigApplicationContext源代码解析
举报原因:
原因补充:

(最多只允许输入30个字)