Spring源码-容器

BeanFactory和ApplicationContext的区别

先从启动类开始分析

这里调用run方法传入的参数,一个是引导类的类型,第二个是main方法传来的命令行的参数,它的返回值是一个容器,通过ctrl + alt + u来查看类视图

什么是BeanFactory?

1.它是ApplicationContext的父接口

2.它才是Spring的核心容器,主要的ApplicationContext实现都组合了它的功能

比如说我们查看ApplicationContext的getBean方法,内部是通过先获取一个BeanFactory,再调用它的getBean方法,所以说是组合了BeanFactory的功能

并且由此可知,BeanFactory应该是当前容器的一个属性,我们打印来看一下,能看到context里面的属性有一个beanFactory,再展开可以看到里面有一个singletonObjects,里面存放的就是单例Bean。

BeanFactory功能

ctrl + f12查看接口的所有方法

表面上只有getBean,实际上控制反转,基本的依赖注入,直至Bean的生命周期的各种功能,都由它的实现类提供,看我们的DefaltListableBeanFactory,它能够管理所有的Bean,不光实现了一个BeanFactory,还实现了多个接口,它还有其它各种各样的方法。

我们来看一下管理所有的单例对象的类DefaltSingletonBeanRegistry

在这个singletonObjects中存放的就是我们的单例对象,key就是对象的名字,Object就是我们的对对象。但是要想查看这个Map,我们只能通过Debug或者反射来实现,来Debug的话,因为里面的Bean较多,不太好查看,这里我们通过反射去实现。

上面的singletonObjects.get()方法,这里相当于beanFactory.getSingletonObejects(),因为我们的beanFactory中也有相应的字段。

ApplicationContext功能

ApplicationContext相比于BeanFactory在功能上扩展的体现主要体现在上述四个接口当中。

MessageSouse

MessageSouse就是用来支持不同语言版本的,例如下述代码

我们通过传入的code值,然后将其翻译成不同的语言版本,当然,翻译的信息需要我们提前配置好,看左边的properties文件,里面所对应的就是不同语言的资源。

ResousePatterResolver

ResousePatterResolver是通过通配符和对应的资源路径来获取资源的方法

其中,Resource在Spring中,是对所有资源或者说是文件的一个抽象,classpath是类路径下,file是磁盘路径下。

也可以通过使用通配符去寻找多个资源。

EnvironmentCapable

EnvironmentCapable就是用来获取一些配置信息的,只不过这些配置信息会来自于不同的源,有的来自于系统的环境变量,有的来自于我们proerties文件的值(根据键值对,通过键去获取)

ApplicationEventPublisher

ApplicationEventPublisher是用来发布事件的,下述是它所对应的方法,

发布的事件需要我们继承一个父类,source代表事件的事件源,就是谁发布的这个事件。

既然有了发布事件,那么一定就要有监听器来接收事件,在Spring当中,任何一个组件都可以作为监听器

然后我们自定义一个方法并在方法加上@EventListener注解来声明当前注解是用来接收事件的。

那么我们了解了那么多关于事件的方法,那么事件是用来干什么的呢?

事件其实就是用来进行解耦的,比如说我在我用户注册业务执行完后需要发送一条短信,而我想要保证单一原则,就是这个方法只干用户注册这一件事,而通过事件,可以在单体架构上实现业务的解耦,通过发布事件,让监听器去干发送消息的方法,从而实现业务上的解耦,这优点类似于MQ的思想。可能有人又有疑问了,那我执行完注册的方法之后,通过方法调用让别的方法去发消息不行吗,根据我的理解,这其实并不是真正意义上的解耦,这其实还是同步的去执行,并没有达到异步的一个效果,此时我们用户注册的方法并不能直接返回,而是要等方法调用执行完之后才能去进行返回。

总结

所以说BeanFactory和ApplicationContext并不仅仅上是接口的继承关系,ApplicationContext是在BeanFactory的基础上组合并扩展了BeanFactory,通过将BeanFactory加入到属性当中来实现组合,通过实现了四个接口来实现功能上的扩展。

并且BeanFactory在功能上并不只有getBean,实际上控制反转,基本的依赖注入,直至Bean的生命周期的各种功能,都由它的实现类提供。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值