此贴用来记录开发遇到的问题哈
背景:
我在做springboot项目b,项目b依赖了项目a,但a中的某个配置类aConfig不是我想要的配置,但又不能改动依赖中的代码,于是我要在b中自定义一个配置类bConfig,并且让aConfig失效,于是就要排除依赖中的配置类
实现:
注:springboot怎么扫描bean以及怎么排除bean网上很多帖子已经很详细咯
springboot是怎样扫描到依赖中的类的?
想要让springboot不加载某个类,需要知道springboot是如何找到类并且装配的。默认情况下,springboot会将主启动类所在包作为扫描路径,该包及该包所有子包都将被扫描。当项目b依赖了其他项目比如a,很有可能包名不一致,那么springboot就扫不到a中的类,此时,我们有几种方式可以解决,
第一种,在当前项目的主启动类或者某个配置类上加包扫描,包路径指定为依赖所在包路径;
第二种,项目a中的配置类定义为自动配置类,
在spring.factories文件中配置
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.your.package.autoconfigure.A1AutoConfiguration,\
com.your.package.autoconfigure.A2AutoConfiguration,\
该属性指定的类将会被spring自动加载,但我们不一定会把a中的所有类都设为自动配置类,我们可以将少数的配置类设为自动配置类,然后在这几个配置类上进行包扫描,扫描指定的包路径,使这些路径下的类也被扫描到,如:
@Configuration
@ComponentScan({"com.your.package", "com.his.package"})
@EnableConfigurationProperties({AProperties.class})
public class AAutoConfiguration {
public AAutoConfiguration() {
}
}
如何指定排除某些类的加载?
首先,排除自动配置类可以通过配置SpringBootApplication注解中的exclude参数,exclude中的所有自动配置类都不会被自动加载。如下:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
,ClassYouWantToExclude.class
})
当要排除普通配置类时,可在主启动类上进行包扫描过滤,ComponentScan中有excludeFilters参数,通过配置该参数可指定某种过滤器ComponentScan.Filter来进行过滤,ComponentScan.Filter有几种类型
ANNOTATION,//注解
ASSIGNABLE_TYPE,//类
ASPECTJ,//
REGEX,//正则
CUSTOM;//
选择一种方式来过滤,此处选用直接指定类的过滤方式,如下:
@ComponentScan(excludeFilters = {@ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE
, classes = {
ClassYouWantToExclude.class
})}
, basePackages = {"com.your.package","com.his.package"}
)
排除失效的情况
当我在一个类进行了对aConfig的排除操作,但是另一个类指定的包扫描又指定扫描到了aConfig,那么,此处的排除操作将失效,aConfig类依然会被加载
解决方式:SpringBoot @CompentScan excludeFilters配置无效的解决方案