通过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进行的自动配置分类总结如下所示:

  1. Spring Framework 配置:Spring Boot 会自动配置 Spring Framework 相关的组件,如 Spring MVC、Spring Data、Spring Security 等。
  2. Web 应用配置:Spring Boot 会自动配置 Tomcat、Jetty、Undertow 等 Web 容器,以及 Web 应用的相关组件,如 Servlet、Filter、Listener 等。
  3. 数据源配置:Spring Boot 会根据应用程序所使用的数据库自动配置数据源,支持主流的关系型数据库和 NoSQL 数据库。
  4. 缓存配置:Spring Boot 会根据应用程序的需求自动配置缓存,支持主流的缓存系统,如 Ehcache、Redis、Hazelcast 等。
  5. 日志配置:Spring Boot 会自动配置 Logback、Log4j2 等日志框架,并提供了统一的日志输出格式。
  6. 健康检查配置:Spring Boot 会自动配置 Actuator,提供了健康检查、监控和管理等功能,可帮助开发者更好地了解和管理应用程序。
  7. 配置文件加载:Spring Boot 会根据应用程序的环境自动加载配置文件,支持多种配置文件格式,如 YAML、Properties 等。
  8. 自动化测试配置:Spring Boot 会自动配置 JUnit、Mockito 等测试框架,以及 TestRestTemplate、MockMvc 等测试工具,可帮助开发者更方便地编写和运行测试用例。

上面只是对Spring boot的配置进行了大致的分类,在启动程序时,如果要查看具体进行了哪些配置,那么在启动类配置上开启Debug配置,启动应用程序,在日志中会打印所有的自动化配置,如下所示:可以看到自动配置分为三类,第一类:条件匹配类配置类,即一定条件满足后才会进行的自动配置,第二类:Unconditional classes,即无任何条件一定会进行自动化配置的类,第三类:Exclusions,可以在编写代码时通过注解将某些自动化配置类进行排除。下面是排除了三个数据库相关的自动配置类。




spring boot自动加载原理 springboot自动加载配置_spring boot自动加载原理


spring boot自动加载原理 springboot自动加载配置_应用程序_02


上面提到了条件注解,常用的条件注解以及含义如下所示,这些条件注解可以与其他的Spring注解一起使用,例如@Service、@Configuration、@Bean等,这个可以灵活地控制Bean的创建和配置。

  1. @ConditionalOnBean:当容器中存在指定Bean时才会生效。
  2. @ConditionalOnMissingBean:当容器中不存在指定Bean时才会生效。
  3. @ConditionalOnClass:当类路径下存在指定的类时才会生效。
  4. @ConditionalOnMissingClass:当类路径下不存在指定的类时才会生效。
  5. @ConditionalOnProperty:当指定的配置属性被设置为指定的值时才会生效。
  6. @ConditionalOnExpression:当指定的表达式结果为true时才会生效。

上面都是一些概念介绍,接下来可以看看在spring boot中是如何实现内置数据库的自动化配置的。在IDE工具中查看DataSourceAutoConfiguration.class文件,可以看到在该class上有条件注解,在EmbeddedDatabaseConfiguration()方法上也存在条件注解,即当DataSource这个class不存在时,那么该配置会生效,所以,当没有在配置文件上配置数据库相关信息,例如mysql等时,就会默认使用内置数据库,可以看到自动配置过程中使用了大量的条件注解。


spring boot自动加载原理 springboot自动加载配置_应用程序_03


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


spring boot自动加载原理 springboot自动加载配置_spring boot自动加载原理_04


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


spring boot自动加载原理 springboot自动加载配置_spring boot_05


spring boot自动加载原理 springboot自动加载配置_应用程序_06


在引入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。


spring boot自动加载原理 springboot自动加载配置_spring boot_07


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

上面的例子介绍了如何通过条件注解的方式实现某些Bean的注入,实际在Spring boot启动过程中会提到一个名称就是应用程序上下文(ApplicaitonContext),ApplicationContext是Spring框架中非常重要的一个部分,它是一个容器,负责管理Bean的创建、配置和生命周期。Spring Boot应用程序在启动时,会加载多个ApplicationContext。以下是一些常见的ApplicationContext:

  1. AnnotationConfigApplicationContext:用于加载基于Java配置类的Spring Bean配置。
  2. ClassPathXmlApplicationContext:用于加载位于类路径下的XML配置文件。
  3. FileSystemXmlApplicationContext:用于加载位于文件系统中的XML配置文件。
  4. WebApplicationContext:用于加载Web应用程序的上下文,可以是XML配置文件或基于Java配置类的配置。
  5. ConfigurableApplicationContext:是所有应用程序上下文的父类,提供了许多通用的上下文功能。

通常,在Spring Boot应用程序中,可以通过@SpringBootApplication注解来创建一个包含WebApplicationContext的ApplicationContext。该注解组合了以下注解:@EnableAutoConfiguration、@ComponentScan和@Configuration。其中,@EnableAutoConfiguration用于启用自动配置,@ComponentScan用于扫描所有的Spring组件,@Configuration用于定义基于Java的配置类。除了默认的WebApplicationContext外,Spring Boot还可以使用其他类型的ApplicationContext来加载不同类型的配置。例如,可以使用@ImportResource注解将XML配置文件加载到基于Java的配置类中,或者使用@ConfigurationPropertiesScan注解来加载配置属性。

以AnnotationConfigApplicationContext为例子,通过AnnotationConfigApplicationContext可以把@Configuration下的Bean添加到ApplicationContext中,而不需要使用传统的XML配置文件。这种方式更加灵活和便捷,同时也避免了XML配置文件可能出现的错误,demo代码如下所示:

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
public class MyApp {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MyService myService = context.getBean(MyService.class);
        myService.doSomething();
    }
}
//写法二
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class, OtherConfig.class);
context.refresh();

无需使用AnnotationConfigApplicationContext将@Configuration下的Bean添加到ApplicationContext中,因为使用条件化配置和自动发现机制,能自动地将一些常用的配置添加到ApplicationContext中。这也是Spring boot自动配置机制的体现。

在Spring boot启动过程中提到了Spring容器是用来创建、管理bean的,上面又提到应用上下文ApplicationContext是用来创建和管理Bean的,那么Spring 容器和ApplicationContext的关系是什么呢?

Spring容器是一个管理Bean的容器,负责创建、配置、管理和销毁Bean对象。ApplicationContext是Spring容器的一种具体实现,它是一个Bean工厂和一个应用程序上下文的集合,它是一个在Spring容器的基础上构建的高级容器,提供了更多的功能和特性,例如国际化、消息源、事件机制等。

ApplicationContext是Spring容器的一种具体实现。

以上就是对Spring boot自动配置加载的解读。