这篇文章先简单的认识一下BeanFactory与ApplicationContext
这是平时每个springboot项目都有的一个启动类,用于启动项目,其实这个run方法的返回值,返回的就是我们的spring容器
ConfigurableApplicationContext就是我们启动后的容器,它继承了ApplicationContext,来看看它的类图
而ApplicationContext类又间接的集成了BeanFactory。但是它对BeanFactory提供能很多功能的扩展
初识BeanFactory
什么是BeanFactory呢?
- 它是 ApplicationContext 的父接口
- 它才是 Spring 的核心容器, 主要的 ApplicationContext 实现都【组合】了它的功能
为什么说是组合了他的功能呢?
我们看看ApplicationContext的getBean方法具体实现
可以看到内部是使用BeanFactory来调用的getBean方法。
或者启动容器看看ApplicationContext 的内部结构
可以看到内部持有一个BeanFactory对象,它里面就有很多我们熟悉的属性了,比如singletonObjects,存放的就是我们的单例对象
接下来看看BeanFactory内部
可以看到,其实它的功能很少。而它的主要实现类是DefaultListableBeanFactory,可以看看它的类图
到这里我们知道了BeanFactory 能干点啥呢?
- 表面上只有 getBean方法
- 实际上控制反转、基本的依赖注入、直至 Bean 的生命周期的各种功能, 都由它的实现类提供
初识ApplicationContext
从类图我们能看到,ApplicationContext的扩展功能主要集中在右边这4个父接口上,分别是
MessageSource、ResourcePatternResolver、ApplicationEventPublisher、EnvironmentCapable
接下来就一个一个看看他们的功能
MessageSource 提供处理国际化资源的能力
像多语言相关的配置,一般都是放在resources下
接下来通过getMessage方法来获取试试
控制台打印如下,可以看到对应的多语言,这就是MessageSource所提供的功能。
ResourcePatternResolver 提供根据通配符匹配资源的能力,像磁盘路径,类路径等去匹配资源
有两个方法,分别是根据路径或者通配符获取单个资源和多个资源。
比如这样,就是获取classpath下application.properties这个文件,我们来打印一下
成功的找到了这个资源。
我们在写一个找到多个资源的例子,我们都知道springboot在启动的时候回去找到META-INF目录下一个叫spring.factories的文件,这些文件里有自动配置相关的信息
看看启动后打印的信息
可以看到一共找到了6个文件,可以看出这个方法能够根据通配符一下找到多个需要的资源。
ApplicationEventPublisher 提供发布事件的能力
主要通过pupblishEvent方法来发布事件,那事件从哪来呢,我们需要自定义一个类,来继承ApplicationEvent类
然后就可以通过pupblishEvent方法发事件了
但是我们还需要一个地方来接收事件,接收事件的我们叫做监听器,我们任何一个类都可以作为监听器。
我们可以随便找一个类,定义一个方法,方法名可以随便定义,但是接收的参数是有要求的,我们发的是什么类型的事件,这边接收的就需要是什么类型的事件,然后需要在方法上加一个@EventListener注解,表面他是一个监听器。
收到之后要做什么就由业务决定了
启动之后能看到控制台执行了监听器里的log打印,这就是事件的使用,他的主要作用其实就是解耦。就像我们的MQ一样。
EnvironmentCapable 提供读取一些环境信息的能力,像环境变量,yaml文件,properties文件的键值等:
如图可以看出EnvironmentCapable就是通过getEnviroment方法来获取一些系统信息的,有的来自环境变量,有的来自配置文件。
好的。下一篇文章来具体了解BeanFactory的实现