拜伦说:时光流逝,世界所给予的欢乐绝不能和它所带走的相比。
本文提纲
- 外化配置
- 自动配置 (autoconfigure)
- spring-boot-autoconfigure 依赖
- Spring MVC 自动配置
- @Configuration 在 Spring Boot 的使用
- 小结
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 这块配置的设计。