这里我们使用的是boot项目。程序入口中run方法返回的就是spring容器。
这里我们打开该接口的类图可以发现,该接口继承了ApplicationContext,ApplicationContext又继承了BeanFactory接口。
快捷键 ctrl + ait + u 打开类图关系
通过类图,他们之间的区别也显而易见。BeanFactory是ApplicationContext的父接口。当然,因为ApplicationContext继承了BeanFactory,所以功能上也更加的晚上。
额外的接口就是ApplicationContext增加的功能。
虽然这儿看着ApplicationContext看起来很强大,但很多核心功能还是BeanFactory提供的,在ApplicationContext中内置了一个BeanFactory对象。一些核心功能就是通过BeanFactory调用的。比如get方法。
getBeanFactory()方法就是得到内置的BeanFactory对象。我们可以输出context进行验证。
BeanFactory的功能
我们找到BeanFactory的接口,查找该接口中有哪些方法。
我们可以看到,也就只有一些核心方法,比如getBean,得到类。containsBean,判断是否有该类等。光看接口的话确实没有很多的功能,但我们要看该接口的实现,我们可以通过ApplicationContext中的getBeanFactory方法查看BeanFactory的实现类。
可以看到BeanFactory的实现类是DeafaultListAbleBeanFactory。我们查看该实现类的类图关系发现,该类不仅实现类BeanFactory这一个接口,还有更多的接口和类,说明功能更加丰富。
我们重点说明下DefaultSingletonBeanRegistry该类,该类中的singletonObjects属性封装了容器中的单例对象。该属性是concurrentHashMap,至于什么是ConcurrentHashmap,前面文章有说明。这里的key是bean的名字,value就是单例对象。
我们可以通过反射来获取该属性,并输出检验。反射的操作这里就不详细说明。
ApplicationContext功能
ApplicationContext中的功能主要说明其对于BeanFactory的扩展功能,前面的类图关系说明,ApplicationContext还继承了四个接口,扩展的功能也是对应接口规定的。
1.MessageSource
查看该接口的方法,可以发现只有一个getMessage方法,该方法实现的功能简单来说就是,翻译各种语言。在开发web项目时,我们的项目可能不止需要中文,还有可能需要其他国家的语言。这时我们可以利用该方法,把一种语言翻译成另外一种我们需要的语言。具体使用就不展开讲了。有兴趣的上网搜搜。
2.ResourcePatternResolver
该接口有一个方法和一个字段。该方法的作用就是解析资源文件。
我们可以通过classpath:前缀读取类路径下的资源文件
如果我们想要读取其他jar包中的META-INF/spring.factories下的自动配置信息。我们就需要使用通配符*。在前缀就是classpath*:
3EnvironmentCapable
可以看到该接口只有一个getEnvironment方法,该方法规定的作用就是返回一个Environment对象。那么Environment是什么呢。

Environment是ApplicationContext实现类中的一个属性
那么ConfigurableEnvironment这个对象是干什么的呢,简单来说就是用来存放配置信息的,配置信息包括我们在properties或者yml文件中写的配置信息,还包括系统环境变量,比如java安装目录。key就是java_home。还有jvm虚拟机参数信息。这些都会由Environment的实现类来进行存储。我们可以拿到Environment对象,取出key对应的value值。
4.ApplicationEventPublisher
该接口的作用就是发布事件的。那么如何发布事件呢?接下来说下步骤
第一步:我们需要自定义个事件对象,该对象继承ApplicationEvent
第二部:调用publishEvent方法发送事件。
第三部:定义事件的接收方,接收方要受到spring容器管理才行。并且还要增加监听器注解。
运行结果
简单说明作用,发布事件的主要作用在于解耦。假设一个注册用户场景,当一个用户在进行注册时,有可能会进行短信验证,还有可能会进行qq,或者微信等多种方式验证,在编写代码时,不能直接写死。我们可以利用发布事件,把事件发布到对应的处理方法中进行处理。
本文使用 文章同步助手 同步





















