SpringBoot2(006):关于配置类(Configuration Classes)和自动配置(Auto-configuration)
Spring Boot2系列文章可以通过这里进行回顾:SpringBoot2(001):入门介绍、官网参考和博客汇总
接下来这一篇主要是对 配置类(Configuration Classes) 和 自动配置(Auto-configuration) 进行说明,分别参考 15. Configuration Classes 和 16. Auto-configuration ,目录如下:
1、配置类(Configuration Classes)
Spring Boot 支持 基于 xml 的配置,但更偏向于使用基于 Java 的配置,通常建议使用定义有 main 方法的主 @Configuration 类(主配置类)。
小提示:对于基于 xml 的 spring 配置,建议尽可能使用对等的基于 java 的配置进行替换,使用 Enable* 注解会是一种比较好的切入方式。
1.1、导入其他的 Configuration Classes
所有的 @Configuration 并不需要都放置在同一个类中,可以考虑分散在多个类,并且通过 @Import 注解 导入。另一种方式则是通过使用 @ComponentScan 自动扫描 spring 配置,其中就包含了 @Configuration classes 。这对于导入其他项目的配置类或者公共配置类就显得比较重要了。毕竟默认的 @SpringBootApplication 只会扫描所在的 root package ,并不一定所有的配置类都会在这个默认包路径下。
举个例子,在 com.wpbxin 这个 root package 下,我们建一个 config 包,也就是 com.wpbxin.config,专门用于存放各种 @Configuration ,这样,主类就完全不需要关注到底需要进行哪些扫描配置,因为这些都会被默认加载, config 中的任何增删在代码层面对主类都是无感的:
package com.wpbxin.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({com.wpbxin.config.XMLConfig.class,com.wpbxin.config.MapperConfig.class})
public class ImportConfig {
}
package com.wpbxin.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.wpbxin.mapper")
public class MapperConfig {
}
1.2、导入 xml 配置
确实还是需要使用 xml 配置的,建议还是从 @Configuration 类开始,通过 @ImportResource 注解来加载 xml 配置文件。举个例子,如果旧项目中配置了 dubbo 的xml文件,可以通过以下这种方式引进来,后续如果换成其他 RPC 框架,可以直接新增配置类即可,这样对代码的侵入性就会降低很多:
package com.wpbxin.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource("classpath:dubbo-*.xml")
public class XMLConfig {
}
2、自动配置(Auto-configuration)
Spring Boot 的 auto-configuration(自动配置)会基于工程应用中添加的 jar 依赖进行自动配置。例如,如果 classpath 中有 HSQLDB,并且应用中没有手动配置数据库连接的 bean,Spring Boot 会自动配置一个默认的内存数据库。
要开启使用 auto-configuration ,我们只需添加 @EnableAutoConfiguration注解 或者 @SpringBootApplication 注解中的一个到某一个 @Configuration 类中就可以。
小提示:@EnableAutoConfiguration注解 或者 @SpringBootApplication 注解,必须二选一,而且通常建议配置在主 @Configuration 类中。
2.1、逐步替换自动配置
Auto-configuration 是非侵入式的,任何时候都可以使用自定义配置来替换默认的自动配置,比如自定义的 DataSource。
可以通过 --debug 参数开启 debug 级别日志信息的记录,来查看具体加载了哪些自动配置项和相关的加载状态。
2.2、如何关闭特定的 Auto-configuration Classes
如果发现有不需要的自动配置项,可以通过使用 @EnableAutoConfiguration 的 exclude 属性来关闭指定的自动配置,例如这里关闭 DataSource 配置:
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
如果指定的类没有在 classpath 里,还可以使用注解的 excludeName 属性并指定全限定名。最后,还可以通过使用 spring.autoconfigure.exclude 来排除限定的自动配置列表类。
小提示:通过注解级别和使用属性级别都可以排除特定的自动配置项。
3、参考