Spring Boot 核心技术 之 自动配置

2021-12-17 09:21:16 浏览数 (1)

拜伦说:时光流逝,世界所给予的欢乐绝不能和它所带走的相比。

本文提纲

  1. 外化配置
  2. 自动配置 (autoconfigure)
  3. spring-boot-autoconfigure 依赖
  4. Spring MVC 自动配置
  5. @Configuration 在 Spring Boot 的使用
  6. 小结

Spring Boot 简化了 Spring 应用的搭建,但免不了配置。约定优先于配置的原则,第一少去了很多的 xml 等配置,第二减少开发的学习成本。本文会涉及到 Spring Boot 外化配置和自动化配置两块内容。

Spring Boot 中在 resources 会有一个 application.yml 的全局配置文件(YAML 语言形式,也可以 properties 结尾):

代码语言:javascript复制
resources
    └── application.yml

外化配置


外化配置,就是 Spring Boot 允许将配置外部化。具体表现包括上面的全局配置文件、命令行和环境变量等来外部化参数配置。外化配置具体写在《Spring Boot 配置文件 - 在坑中实践》http://www.bysocket.com/?p=1786 本文重点是 自动配置。

自动配置 (autoconfigure)


顾名思义,就是 Spring Boot 默认自动化配置了很多,比如默认用的内嵌式容器是 Tomcat 并端口设置为 8080。那核心实现自动化配置的工程是 spring-boot-autoconfigure。

spring-boot-autoconfigure 依赖


首先,spring-boot-starter 包依赖包含了 spring-boot-autoconfigure 包依赖,spring-boot-starter 是核心 Starter 包,包括了自动化配置支持、日志、YAML 文件解析的支持等。

spring-boot-autoconfigure 是 Spring Boot 自动化配置包依赖。它包含了 spring-boot 包,重点的是又包含了可选依赖类似如下,将 optional 属性设为 true。可选依赖就是可能用到该依赖,当需要的时候才会去用:

代码语言:javascript复制
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <optional>true</optional>
        </dependency>

所以,spring-boot-autoconfigure 职责是为 Spring Boot 应用在各个模块提供自动化配置的作用,即加入对应 pom,就会有对应配置其作用。例子:

我们在 Spring Boot 应用去实现 Spring Web MVC 功能,只需要加入 spring-boot-starter-web 依赖即可。不像以前那传统模式要配置很多 Spring MVC 配置文件,自动配置会提供几乎所有的默认配置,从而降低开发复杂度。

比如 spring-boot-autoconfigure 包中包含了很多 XXXAutoConfiguration:

  • DataSourceAutoConfiguration - 数据源自动配置类
  • ThymeleafAutoConfiguration - Thymeleaf 模板引擎自动配置类
  • WebMvcAutoConfiguration - Web MVC 自动配置类

Spring MVC 自动配置


spring-boot-autoconfigure 中的 Web MVC 自动配置累,具体为 Spring MVC 自动配置如下:

  • 引入 ContentNegotiatingViewResolver 和 BeanNameViewResolver
  • 对静态资源的支持,包括对 WebJars 的支持
  • 自动注册 Converter,GenericConverter,Formatter
  • 对 HttpMessageConverters 的支持
  • 自动注册 MessageCodeResolver
  • 对静态 index.html 的支持
  • 对自定义 Favicon 的支持
  • 自动使用 ConfigurableWebBindingInitializer

如果想添加拦截器、过滤器等,只要添加对应的配置类,并用 @Configuration 标识。

@Configuration

这个注解的类的作用是将具体配置类注入到 Spring 容器,并被具体的 Bean 调用注入。

@SpringBootApplication

这个注解一般会在 Spring Boot 启动应用类 XXXApplication,这个注解结合了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan。

@Configuration 在 Spring Boot 的使用


案例工程 「springboot-configuration」 : https://github.com/JeffLi1993/springboot-learning-example

只要新建一个配置类 MessageConfiguration :

代码语言:javascript复制
@Configuration
public class MessageConfiguration {

    @Bean
    public String message() {
        return "message configuration";
    }
}

对应的测试类 MessageConfigurationTest :

代码语言:javascript复制
public class MessageConfigurationTest {

    @Test
    public void testGetMessageBean() throws Exception {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MessageConfiguration.class);
        assertEquals("message configuration", ctx.getBean("message"));
    }

    @Test
    public void testScanPackages() throws Exception {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.scan("org.spring.springboot");
        ctx.refresh();
        assertEquals("message configuration", ctx.getBean("message"));
    }
}

所以,自定义配置只要使用 @Configuration 注解即可。

小结

大道至简吧,我还是毕竟推崇 Spring Boot 这块配置的设计。

0 人点赞