这篇博文主要总结我自己学到现在对spring boot的理解,这里包含的spring boot核心特性包含:web服务器、工厂加载机制、配置加载机制、条件注解等。
一开始是由Pivotal团队内部有一个想法:ICWA(Inprove Containerless Web Application Architectures改进无容器的web应用),也就是认为基于servlet的开发太繁琐了,会给很多学习spring的开发工作者增加很多学习负担和压力,那来总结一下基于servlet容器开发模式会面临的问题吧:
内置的servlet已经成为过去式,在spring boot中将此特性称为WebServer WebServer表示一个可内置的web服务器(比如说TomcatWebServer/NettyWebServer/JettyWebServer/UndertowWebServer),可以通过WebServer接口对外提供的start方法启动服务器,用stop方法停止服务器,有了WebServer,我们不再需要关心外部的Web服务器、web.xml文件、乱七八糟的Servlet和Filter等,只需要编写代码并把项目打包成jar包后直接运行即可,这非常适合云原生架构中的可独立部署特性。
有了WebServer,我们不再需要关心外部的Web服务器、web.xml文件、乱七八糟的Servlet和Filter等
以下是WebServer的源码:
源码主要方法的注解部分: getPort()方法返回server监听的端口号,如果没有监听,则返回-1 对于WebServer来说,有两个工厂接口去创建它,一个是ServletWebServerFactory,一个是ReactiveWebServerFactory 我们熟悉的定制错误界面、错误页注册表,要用到的ConfigurableWebServerFactory接口,它就是继承自WebServerFactory(不过这是一个空接口),ConfigurableWebServerFactory接口表示这是一个可配置的WebServerFactory接口 ConfigurableWebServerFactory提供了WebServer常用的配置信息,它的子接口表示各个WebServer实现类独有的配置,真正创建WebServer的工厂类(像TomcatServletWebServerFactory)通过继承和实现接口的方式实现了ConfigurableWebServerFactory和ServletWebServerFactory这两个接口。
ConfigurableWebServerFactory
独有的配置
后续对WebServer添加了新的方法:WebServerInitializedEvent 这个类主要是表示ApplicationContext刷新过后且WebServer处于ready状态下会触发的事件
WebServerInitializedEvent
注意:spring cloud服务注册的时机就是在WebServerInitializedEvent事件被触发的时候噢!
springboot大家都懂,他最重要的就是——自动装配,那么自动装配主要就是以下这个模块,这个模块里有很多第三方的依赖,比如什么WebMvcAutoConfiguration/KafkaAutoConfiguration等 具体的spring boot提供的条件注解这里提供一篇博客,写的很全面: 传送门 这里跳过
条件注解作用于自动配置类,那么自动配置类是从哪里被加载的呢? 答案就是通过工厂加载机制啦 这个机制会从META-INF/spring.factories文件中加载自动化配置类
像我们熟悉的AOP、Cache等都被spring boot自动装配了 再回到spring boot启动类中: 随便找的一个启动类哈,不要介意~ 启动spring boot应用最熟悉的就是@SpringBootApplication,这个注解是一个复合注解: 在项目启动的时候@EnableAutoConfiguration注解会导入AutoConfigurationImportSelector AutoConfigurationImportSelector内部的selectImports方法中要导入的配置类是通过SpringFactoriesLoader获取的 SpringFactoriesLoader
AutoConfigurationImportSelector
SpringFactoriesLoader
熟悉的配置文件来啦
在spring boot中,将配置文件封装成了PropertySourceLoader接口,这个接口源码如下: getFileExtensions()方法表示支持的文件后缀 load方法表示将资源Resource加载成PropertySource 关于配置文件的话呢,大家都知道有两种啦——以yml、properties结尾这两种,对于PropertySourceLoader接口spring boot只有两种实现:
PropertiesPropertySourceLoader
YamlPropertySourceLoader 另外,在spring boot内部还维护着一个ApplicationListener集合属性,用于监听ApplicationEvent。在默认的情况下会被工厂加载机制(加载key为org.springframework.context.ApplicationListener): 其实,ConfigFileApplicationListener这个类是spring boot配置加载的核心类,但是这个类目前已经过时了,下次再重点讲这个吧
与Production-ready特性有关,这些特性需要引入模块spring-boot-starter-actuator才生效噢 这个主要的作用就是让我们监控应用以及跟应用之间的交互作用。其中,Endpoint是比较核心的功能,它的作用就是为了让我们方便监控和应用交互。 好啦,那今天就到这吧,希望以后我对spring boot的掌握和理解能够更加深刻。