SpringBoot高度模块化,特别适合需要高度模块化的业务项目,SpringBoot整体设计思路就是简单、高效、剥离组件、省代码。
1)spring-boot
封装了需要走自动配置的公共bean,例如数据源DataSourceBuilder,负责SpringBoot支持的数据源的底层逻辑处理。
2)spring-boot-autoconfigure
自动配置模块,@EnableAutoConfiguration注解触发所有需要走自动配置的组件,比如DataSourceAutoConfiguration,会在Server容器启动的时候自动的注入。
3)spring-boot-starters
暴露模块中间件给使用方,高度的模块化,具体的模块化细节请参考源码,例如需要使用AMQP,只需要引入spring-boot-starter-amqp,spring-boot-starter-amqp会自动的集成spring-boot-starter、
spring-messaging和spring-rabbit
4)spring-boot-cli
spring-boot-cli可以快速搭建一个spring原型应用,并且可以运行Groovy脚本
5)spring-boot-actuator
SpringBoot还提供了许多附加功能,可以帮助我们在应用程序部署到生产环境后对其进行监控和管理。springboot提了http,jmx,shell等功能来管理和监控我们的应用程序。另外审计,监控和性能指标的可以自动应用到应用程序上。
6)spring-boot-loader
SpringBoot允许使用java -jar命令启动模块
7)spring-boot-tools
SpringBoot提供的通用的工具模块
spring-boot-configuration-processor:使用@ConfigurationProperties生成元数据,元数据处理模块
spring-boot-configuration-metadata:元数据模块
.....
.....
3. SpringBoot2.0.X web容器模块设计
SpringBoot2.0重构了web容器模块,植入了嵌入式容器,使用工厂设计模式和模板设计模式,完美的将流式web容器和基于Servlet的容器在代码层隔离,灵活配置,完全解耦,开箱即用,模块设计如下:
熟悉web开发的同学都知道,凡是需要Servlet特性的业务场景,项目必须要在web容器中启动,比如Tomcat、jetty等,但是如果项目只是api-gateway,只是提供一些请求路由功能,那么就完全需要使用Netty这样无阻塞的高性能NIO框架,因此SpringBoot2.0.X集成了Netty。
SpringBoot是如何做到内置容器和外置容器的灵活切换,原理分析如下:
1)外置容器启动
War包需要借助SpringBoot框架内嵌容器之外的web容器启动,应用可以重载SpringBootServletInitializer.configure方法+注解@SpringBootApplication,从内置容器切换到外置容器,如果需要了解切换原理,需要详细的翻阅SpringBootServletInitializer源码,SpringBootServletInitializer继承org.springframework.web.WebApplicationInitializer,暴露configure方法,让应用可以重写,并重新构造SpringApplicationBuilder,并绑定Servlet、Filter和ServletContextInitializer支持应用war包部署。
2) 内置标准容器启动
java虚拟机会自动的去加载main方法,通过main方法来委托Spring Boot的SpringApplication类,SpringApplication.run引导我们的应用程序,启动Spring,然后启动自动配置的Tomcat Web服务器。其实SpringApplication.run方法也是模拟传统的web容器启动war的原理,将jar包自动的加载的内置的容器中,具体原理将在接下来的文章中输出。