可能是最卷的Spring源码系列(二):ApplicationContext的初始化

本系列对spring源码的分析都基于AnnotationConfigApplicationContext,其它类型的ApplicationContext暂时不会涉及

1、AnnotationConfigApplicationContext的继承关系

AnnotationConfigApplicationContext的继承关系
可以看到ApplicationContext的继承关系是非常复杂的,这里我们只需要知道一点就可以,spring需要哪一类功能,就会为这一类功能定义一个接口,然后ApplicationContext继承这个接口,但是ApplicationContext没有做具体的实现,没有看过spring源码的同学看到这里就有疑问了,实现接口不是必须要实现接口的方法吗?你这不是在忽悠吗?注意这里所说的没有实现,并不是没有实现这个方法,而是具体功能又别的对象实现,ApplicationContext内实例化一个相关的对象,然后对这个对象的方法进行调用,下面会举例说明,至于为什么这么设计,无非是提高抽象化的程度,具体的体现大家可以思考一下。
ApplicationContext对beanFactory的实现
ApplicationContext对beanFactory的实现
在这里插入图片描述

2、AnnotationConfigApplicationContex的初始化主要流程

我们通过AnnotationConfigApplicationContex来使用spring容器时一般会通过下面两种方式的一种

// 方式一
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MyConfig.class);
// 方式二
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
		ac.register(MyConfig.class);
		ac.refresh();

下面我们看一下源码

// 方式一
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
		this();
		register(componentClasses);
		refresh();
	}
// 方式二
public AnnotationConfigApplicationContext() {
		this.reader = new AnnotatedBeanDefinitionReader(this);
		this.scanner = new ClassPathBeanDefinitionScanner(this);
	}

通过源码可以看到这两种方式的底层原理是一样的
那这两种方法的区别在哪里呢?
要知道这两种方式的区别,首先要了解下spring的初始化流程,后续文章会详细讲到,这里我们只需要知道spring的初始化流程只要是通过refresh()完成的就可以了,这样我们就知道两种方式的区别了,方式二可以在refresh()之前做一些其他操作,这里的其他操作指的是对spring提供给我们的api进行调用
在这里插入图片描述
回到AnnotationConfigApplicationContext的初始化流程,我们看到他的无参构造方法new了两个成员对象
在这里插入图片描述
在这里插入图片描述
但是这里new出的不只是这两个对象,因为java在使用无参构造器进行实例化对象的时候,会先调用父类的无参构造器,那么一下对象也会被new出来
在这里插入图片描述
再往上层的父类也会有其他,不过我们暂时只关注这三个
其它被new出来的对象:
在这里插入图片描述

3、简述AnnotatedBeanDefinitionReader、ClassPathBeanDefinitionScanner、DefaultListableBeanFactory的作用

下面会简述这三个对象的作用,后面文章对它们都会详细介绍

	private final AnnotatedBeanDefinitionReader reader;

作用:
1、把context.register()的类变成BD,并放入容器
2、把几个固定的postProcessor包装成BD,并放入容器

	private final ClassPathBeanDefinitionScanner scanner;

作用:
1、context.scan() 对指定包进行扫描
2、被继承进行个性化扫描,其中ConfigurationClassPostProcessor中实现了个性化扫描

	private final DefaultListableBeanFactory beanFactory;

作用:
主要提供了getBean方法,但是这个方法衍生出了一系列的类和方法,主要完成了spring bean的创建过程,这里的spring bean不同于普通的java类,简单来说spring bean是一个特殊的java类,他有一系列属性和生命周期,后面会专门写一篇文章介绍spring bean,这里就理解为AnnotationConfigApplicationContex的getBean()就是由beanFactory提供的就可以了

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值