SpringBoot是一个微服务框架。
入口为: SpringApplication
初始化,是在 run()方法内,初始化SpringContext的一些东西。
读取的时候,是读取spring.factories文件里的key value值。
所以你想定制化一些自己的东西,只需要在 META-INF下,加载自己的定制化 initializers listeners。
当然 initializers 肯定要实现 ApplicationContextInitializer 接口的。
initializers =
DelegatingApplicationContextInitializer
ContextIdApplicationContextInitializer
AutoConfigurationReportLoggingInitializer
ConfigurationWarningsApplicationContextInitializer
ServerPortInfoApplicationContextInitializer
pringboot 加载这些东西,主要依赖 SpringApplication中的getSpringFactoriesInstances 方法,去获取相应的类,设计的很好。
具体想看细节的,可以看一下这个方法的源代码。通过反射,实例化,以及类加载器,很好的去某一确定的路径下,加载一些东西。
可以自己保留下来,作为工具类使用。
listeners =
ConfigFileApplicationListener
AnsiOutputApplicationListener
LoggingApplicationListener
BackgroundPreinitializer
ClasspathLoggingApplicationListener
DelegatingApplicationListener
ParentContextCloserApplicationListener
FileEncodingApplicationListener
LiquibaseServiceLocatorApplicationListener
也是放在 spring.factories里的,读取其中的key、map。如果想要扩展,也是可以自己写spring.factories,然后放在classpath路径下,
一样的前提是 要实现 ApplicationListener 方法。具体加载过程和 initializers 一样。
listeners的使用,是观察者模式。
在 SpringApplication的代码中,new SpringApplicationRunListeners ,并且,通过java反射实例化 EventPublishingRunListener,注册监听事件。
如果自定义监听 ApplicationStartedEvent 事件的实现,继承 SpringApplicationRunListener ,放入自定义的 spring.factories 中。
那么可以监听 事件,进行初始化启动的一些动作。
创建 SimpleApplicationEventMulticaster 事件分发对象; 把 SpringApplication 中初始化的 listeners 全部放入set中。
SpringApplicationRunListeners 调用started()方法,逐一调用
通过 SimpleApplicationEventMulticaster 事件分发对象分别 invokeListener。 调用 listeners 处理 ApplicationStartedEvent 对象。
大概的初始化过程,是debug一步一步,看到的。具体各个listener是干嘛的,还没有去看。
无论怎么样,这也是看代码的一个开始,给自己一个鼓励,慢慢坚持下去吧。后续再细看。