开始
今天,我们来聊聊Spring Boot中的初始化器和Bean定义加载器。
ContextIdApplicationContextInitializer
ContextIdApplicationContextInitializer,上下文id初始化器。该初始化器的核心作用是给上下文起个名,一般为application,可以通过spring.application.name配置来进行修改。
DelegatingApplicationContextInitializer
DelegatingApplicationContextInitializer,委托应用上下文初始化器。该初始化器的能力和委托应用监听器是一样的,它使得我们可以通过配置文件的context.initializer.classes来配置初始化器,而不必使用spring.factories。如下:
效果如下:
初始化器(忽略上半部分)
ServerPortInfoApplicationContextInitializer
ServerPortInfoApplicationContextInitializer,服务端口信息初始化器,该初始化器同时也是一个监听器。回到SpringApplication类的第365行,我们发现,365行执行了初始化。而在ServerPortInfoApplicationContextInitializer中,在初始化时,将自己放到了应用的监听器列表中。
此后,ServerPortInfoApplicationContextInitializer会监听web服务初始化事件,该事件发生时,会将服务的端口号这到环境的属性源中。
应用上下文准备就绪
之前一篇文章里,我们已经聊到过这个事件,点此查看:自定义Spring Boot的Banner和Bean名称是怎么来的?。今天,我们完成了sprng.factories中的监听器和初始化器的学习,就更加容易理解Spring Boot,在应用上下文准备就绪之前,做了些什么,最主要的是,我们了解到,这其中,一项重要的工作是找到了合适的配置文件,并将其加载到了属性源中。
应用载入完成事件
应用上下文准备完成事件之后,下一个是应用载入完成事件。这两个事件之间,Spring Boot主要做了以下工作:
1. 获取并打印应用启动概要信息。主要包含应用名,版本号,线程id,当前运行环境等信息。
2. 将应用参数和banner注册到bean工厂中。注册名分别是springApplicationArguments和springBootBanner。意味着你可以通过这两个名称在需要的地方注入这两个对象。
3. 设置是否允许Bean定义重写。
4. 加载Bean。
5. 触发应用载入完成事件。
外观模式
外观模式是设计模式的一种,这种设计的典型特征是向客户端提供一个接口来进行系统的访问,从而对客户端隐藏系统的复杂性。
举个粟子。
手机怎么开机?大家都知道,按下电源键。但是,真的这么简单吗?不详述,给张图,自己体会。
手机开机过程
也就是说,手机用一个简洁的外观,把一个复杂的流程包装起来,只留给用户一个简单的电源键。这就是外观模式。
在程序中,也是这样的,用简单的接口隐藏复杂的内部逻辑,这就是外观模式。
BeanDefinitionLoader
BeanDefinitionLoader,Bean定义加载器。核心作用是加载Bean定义。我们看到,这个类中,load方法一共有7个,但是,public的只有一个。也就是说,我们在加载时,只需要调用这个load方法,就能完成各种各样的Bean定义加载任务,而无需关注其具体逻辑实现,这就是典型的外观模式。
BeanDefinitionLoader类中,先关注类变量,发现几个主要的Reader,分别是AnnotatedBeanDefinitionReader,XmlBeanDefinitionReader,BeanDefinitionReader和ResourceLoader,还有一个Scanner,ClassPathBeanDefinitionScanner。
先根据名字来猜测一下,Reader用于从某些地方来读取Bean定义,而Scanner是从某些空间来扫描获取Bean定义。事实上,也是如此。
我们再看BeanDefinitionLoader中主要的load方法,我们发现,根据参数的不同类型,采用不同的Reader去进行处理。
Class类型:如果参数是Class类型,会用AnnotatedBeanDefinitionReader去处理。当然,此前尝试使用GroovyBeanDefinitionSource去处理,这是对Groovy的兼容,我们是暂时不作介绍。
Package类型:如果参数是Package类型,即一个包时,会使用ClassPathBeanDefinitionScanner去处理。
Resource类型:如果参数是Resource类型,会使用XmlBeanDefinitionReader去处理。
String类型:如果参数是String类型,会按照Class,Resource,Package的顺序,依次去尝试解析和处理。
相关
Spring Boot中,在配置文件中配置监听器
Spring Boot多环境配置的简单demo
Spring Boot的优点,有哪些值得我们使用的地方
自定义SpringApplication初始化器和监听器
举报/反馈

简单说架构

166获赞 807粉丝
从简单的角度切入系统架构
关注
0
0
收藏
分享