SpringBoot作为一些常用开发框架的集合(可以成为脚手架),其自身的自动化配置给我们的开发带来质的改变,不必去担心繁琐的XML配置(反正我到现在都没有去配什么XML文件),用一个application.properties文件就可以在日常开发中完全适用,我们通过各种功能性示例体验了Spring Boot的自动化配置给我们所带来的超便利的新开发方式。
但是SpringBoot的自动化配置也带入些许隐患(优>>>弊)
jar包冲突
项目依赖复杂的情况下,由于依赖方的依赖组织不够严格,可能引入了一些实际我们不需要的依赖,从而导致我们的项目满足一些特定的自动化配置。(自动配置过剩问题,我遇到了很多这种问题,比如jpa与redis的冲突)
传统Spring项目转换为Spring Boot项目的过程中,由于不同的组织方式问题,引发自动化配置加载的错误,比如:通过xml手工组织的多数据源配置等。(升级框架时会遇到各种兼容问题,对升级框架不太友好)
上面这些原因都会导致不必要的自动化配置加载而导致应用无法启动或触发/health的健康检查不通过等问题。
若是遇到jar包兼容问题,则是通过外部依赖的修改来解决:通过与依赖方沟通,在对方提供的API依赖中去掉不必要的依赖
通过禁用指定的自动化配置来避免加载不必要的自动化配置,下面列举了禁用的方法:
-使用了@EnableAutoConfiguration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
禁止了DataSource自动加载的类
-使用了@SpringBootApplication
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
-通过配置文件来设置
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
日志框架冲突
jar包冲突中比较常见的是关于springboot本身的日志配置
Exception in thread “main” java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation
这个异常是由于打印日志的jar冲突导致,SpringBoot本身有打印日志的功能(springboot默认使用Commons Logging),如果跟本地的冲突,就需要去掉再调用其他的,如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.3.3.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>