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

二、AnnotationConfigApplicationContext的无参构造方法

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

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

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

2.1beanFactory的创建

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

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

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

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

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

回到AnnotationConfigApplicationContext的无参构造中。

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

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

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

2.3、知识点

2.3.1、DefaultListableBeanFactory

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

类结构图如下:

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的类继承体系如下图:

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。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值