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的生命周期的各种功能,都由它的实现类提供。