通过spring boot可以很方便的独立运行spring应用程序,因为spring boot内嵌了Tomcat、Jetty等servlet容器,切提供自动配置功能,无需进行XML配置即可自动运行应用程序。那么Spring boot启动过程中具体进行了哪些操作呢?下面是Spring Boot启动过程中执行的步骤
1.加载 Spring Boot 核心配置:在启动过程中,Spring Boot会加载并解析一系列核心配置文件,例如 application.properties/application.yml、application-{profile}.properties/application-{profile}.yml 等。在这些配置文件中,可以配置一些应用程序所需的基本配置,例如端口号、数据库连接信息、日志级别等。
2.加载 Spring 容器:Spring Boot 是基于 Spring框架的,因此在启动过程中,需要加载 Spring 容器,来管理应用程序中的各种 Bean。
3.自动配置:Spring Boot 中提供了大量的 Starter 依赖,它们会自动配置相应的 Bean,并将其注入到 Spring 容器中。例如,如果应用程序中需要使用 Spring Data JPA 来访问数据库,只需要添加 spring-boot-starter-data-jpa 依赖,Spring Boot 就会自动配置数据源、事务管理器等相关 Bean。
4.启动 Embedded Web 容器:Spring Boot 支持内嵌式的 Web 容器,例如 Tomcat、Jetty 和 Undertow。启动过程中,会根据应用程序的类型自动选择适合的 Web 容器,并将其启动。在 Web 容器启动之前,Spring Boot 会将应用程序中所有的 Web 相关的 Bean 注入到容器中,例如 Controller、Filter、Listener 等。
5.注册 ServletContextListener:在启动 Web 容器后,Spring Boot 会自动注册一个 ServletContextListener,用于启动 Spring MVC 框架,并将其注入到 Web 容器中。
6.启动 Spring MVC 框架:Spring MVC 框架是一个 Web 框架,它负责处理 HTTP 请求和响应,并将它们转换为 Java 对象。在 Spring Boot 启动过程中,Spring MVC 框架会被启动,并将所有的 Controller、ViewResolver 等相关的 Bean 注入到 Spring 容器中。
在上述Spring Boot启动过程中,究竟会进行哪些自动配置呢?Spring boot进行的自动配置分类总结如下所示:
Spring Framework 配置:Spring Boot 会自动配置 Spring Framework 相关的组件,如 Spring MVC、Spring Data、Spring Security 等。
Web 应用配置:Spring Boot 会自动配置 Tomcat、Jetty、Undertow 等 Web 容器,以及 Web 应用的相关组件,如 Servlet、Filter、Listener 等。
数据源配置:Spring Boot 会根据应用程序所使用的数据库自动配置数据源,支持主流的关系型数据库和 NoSQL 数据库。
缓存配置:Spring Boot 会根据应用程序的需求自动配置缓存,支持主流的缓存系统,如 Ehcache、Redis、Hazelcast 等。
日志配置:Spring Boot 会自动配置 Logback、Log4j2 等日志框架,并提供了统一的日志输出格式。
健康检查配置:Spring Boot 会自动配置 Actuator,提供了健康检查、监控和管理等功能,可帮助开发者更好地了解和管理应用程序。
配置文件加载:Spring Boot 会根据应用程序的环境自动加载配置文件,支持多种配置文件格式,如 YAML、Properties 等。
自动化测试配置:Spring Boot 会自动配置 JUnit、Mockito 等测试框架,以及 TestRestTemplate、MockMvc 等测试工具,可帮助开发者更方便地编写和运行测试用例。
上面知识对Spring boot的配置进行了大致的分类,在启动程序时,如果要查看具体进行了哪些配置,那么在启动类配置上开启Debug配置,启动应用程序,在日志中会打印所有的自动化配置,如下所示:可以看到自动配置分为三类,第一类:条件匹配类配置类,即一定条件满足后才会进行的自动配置,第二类:Unconditional classes,即无任何条件一定会进行自动化配置的类,第三类:Exclusions,可以在编写代码时通过注解将某些自动化配置类进行排除。下面是排除了三个数据库相关的自动配置类。


上面提到了条件注解,常用的条件注解以及含义如下所示,这些条件注解可以与其他的Spring注解一起使用,例如@Service、@Configuration、@Bean等,这个可以灵活地控制Bean的创建和配置。
@ConditionalOnBean:当容器中存在指定Bean时才会生效。
@ConditionalOnMissingBean:当容器中不存在指定Bean时才会生效。
@ConditionalOnClass:当类路径下存在指定的类时才会生效。
@ConditionalOnMissingClass:当类路径下不存在指定的类时才会生效。
@ConditionalOnProperty:当指定的配置属性被设置为指定的值时才会生效。
@ConditionalOnExpression:当指定的表达式结果为true时才会生效。
上面都是一些概念介绍,接下来可以看看在spring boot中是如何实现内置数据库的自动化配置的。在IDE工具中查看DataSourceAutoConfiguration.class文件,可以看到在该class上有条件注解,在EmbeddedDatabaseConfiguration()方法上也存在条件注解,即当DataSource这个class不存在时,那么该配置会生效,所以,当没有在配置文件上配置数据库相关信息,例如mysql等时,就会默认使用内置数据库,可以看到自动配置过程中使用了大量的条件注解。

接下来,通过一个实际的Demo例子来理解自动配置的过程,初始化两个项目,项目一主要有一个GreetingApplicationRunner这个类,项目二主要有GreetingAutoConfiguration类,切项目二中在properties文件中讲启动类添加到EnableAutoConfiguration配置下,这样这个配置类才会进行自动配置。在项目二的配置类中,可以看到也使用了条件注解,即项目中存在GreetingApplicationRunner这个类(也就是项目一创建的类)时,配置类GreetingAutoConfiguration的逻辑才生效。在该配置类下,创建了Bean,这个Bean的创建也使用了条件注解,即当GreetingApplicationRunner这个class缺失的情况下,且配置文件中greeting.enabled这个配置项为true的情况下,会自动化生成GreetingApplicationRunner这个Bean,创建的这个Bean构造函数中的参数为空。

接着创建项目三,在项目三的pom.xml文件中引入上面的两个项目配置,在IDE工具中如果引入Module的方式,引入上面创建的两个项目的pom.xml文件。项目三的pom.xml文件如下所示,IDE引入Module的过程如下图所示:


在引入Module后,在项目三上启动应用程序,第一种启动方式是:greeting.enabled=true,@Bean下面的代码注释掉,执行程序可以看到初始化了GreetingApplicationRunner这个class,打印的信息是"we all like default",说明是自动配置生成的bean,第二种启动方式是:greeting.enabled=true,@Bean下面的代码取消注释,执行程序后,打印的信息是“We all like spring”,说明是@Bean创建的GreetingApplicationRunner这个class,第三种启动方式是:greeting.enabled=false,注释掉@Bean下面的代码,可以看到没有打印任何信息,即没有创建GreetingApplicationRunner这个class。

以上就是自动配置的演示Demo,该Demo来自极客时间专栏,详细信息可下载Demo运行。