spring源码笔记二:AnnotationConfigApplicationContext的无参构造方法

二、AnnotationConfigApplicationContext的无参构造方法

源码分析从main方法的第一行看起。

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

我们新建了一个AnnotationConfigApplication对象,并将配置类的class对象传入进去。这一行代码完成了配置类的解析,以及整个spring容器的初始化。

2.1beanFactory的创建

spring源码笔记二:AnnotationConfigApplicationContext的无参构造方法_第1张图片

点进源码,该构造方法首先调用无参构造。

spring源码笔记二:AnnotationConfigApplicationContext的无参构造方法_第2张图片

我们知道,在java中创建对象时,会先执行父类的构造方法。

我们查看AnnotationConfigApplicationContext的父类GenericApplicationContext的无参构造。

spring源码笔记二:AnnotationConfigApplicationContext的无参构造方法_第3张图片

这里新建了一个DefaultListableBeanFactory赋值给了成员变量beanFactory。这里就完成了beanFactory的创建。

2.2bean定义读取器和类路径扫描器的创建

回到AnnotationConfigApplicationContext的无参构造中。

spring源码笔记二:AnnotationConfigApplicationContext的无参构造方法_第4张图片

这里创建了两个对象AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner对象,并将当前的AnnotationConfigApplicationContext对象传入进去。

第一个对象AnnotatedBeanDefinitionReader是负责标注了注解的类的bean定义的读取,第二个对象ClassPathBeanDefinitionScanner是负责包的扫描,并读取类的bean定义。

创建完对象后,赋值给了成员变量。

2.3、知识点

2.3.1、DefaultListableBeanFactory

DefaultListableBeanFactory类非常重要,他是spring中对beanFactory的默认实现。

类结构图如下:

spring源码笔记二:AnnotationConfigApplicationContext的无参构造方法_第5张图片

2.3.2、BeanDefinition(Bean定义)

在2.2节中我们提到了这里创建了一个bean定义读取器,那么什么是Bean 定义呢。Bean定义在spring中用一个接口标识,叫做BeanDefinition。

在spring中,由spring容器管理的类,称为spring的bean。例如我们写的controller、service在spring中都统一称为bean,为了描述这些bean,spring就定义了一个数据结构BeanDefinition来描述这些Bean。(BeanDefinition是一个非常重要的概念,后文会大量涉及)

通常spring在读取或扫描了一个bean之后,会读取出这个bean的相关信息,并将其封装成BenaDefinition对象,存入容器中,以便之后使用。

BeanDefinition的类继承体系如下图:

spring源码笔记二:AnnotationConfigApplicationContext的无参构造方法_第6张图片

spring源码笔记二:AnnotationConfigApplicationContext的无参构造方法_第7张图片

BeanDefinition接口主要有1个子抽象类AbstractBeanDefinition和一个子接口AnnotatedBeanDefinition。

AbstractBeanDefinition有三个子类,分别为RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition。其中RootBeanDefinition表示普通的Bean或者处于父子Bean关系下的父Bean;ChildBeanDefinition表示父子Bean关系下的子Bean;GenericBeanDefinition是spring2.5以后出来的,是一个一站式的Bean,现在一般用的是这个子类。

AnnotatedBeanDefinition接口的两个实现类AnnotatedGenericBeanDefinition和ScannedGenericBeanDefinition也是AbstractBeanDefinition抽象类的子类。AnnotatedGenericBeanDefinition表示被注解的Bean,ScannedGenericBeanDefinition表示被扫描的Bean。

你可能感兴趣的:(spring源码)