SpringBoot—@ComponentScan注解过滤排除某个类的三种方法

在引用jar包的依赖同时,经常遇到有包引用冲突问题。一般我们的做法是在Pom文件中的dependency节点下添加exclusions配置,排除特定的包。
这样按照包做的排除范围是比较大的,现在我们想只排除掉某个特定的类,这时我们怎么操作呢?

二、解决冲突的方法

方法一:pom中配置排除特定包

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
    <exclusions>
            <exclusion>
            <artifactId>slf4j-api</artifactId>
            <groupId>org.slf4j</groupId>
            </exclusion>
    </exclusions>
    </dependency>
  • 缺点:排除的范围比较大,不能排除指定对象;

方法二:@ComponentScan过滤特定类

@ComponentScan(value = "com.xxx",excludeFilters = {
		@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {
				com.xxx.xxx.xxx.class,
				com.xxx.xxx.xxx.class,
@SpringBootApplication
public class StartApplication {
	public static ApplicationContext applicationContext = null;
	public static void main(String[] args) {
		applicationContext = SpringApplication.run(StartApplication.class, args);
  • 优点:使用FilterType.ASSIGNABLE_TYPE配置,可以精确的排除掉特定类的加载和注入;
  • 缺点:如果有很多类需要排除的话,这种写法就比较臃肿了;

方法三:@ComponentScan.Filter使用正则过滤特定类

@ComponentScan(value = "com.xxx",excludeFilters = {
	@ComponentScan.Filter(type = FilterType.REGEX,pattern = {
            //以下写正则表达式,需要对目标类的完全限定名完全匹配,否则不生效
			"com.xxx.xxx.impl.service.+",
@SpringBootApplication
public class StartApplication {
	public static ApplicationContext applicationContext = null;
	public static void main(String[] args) {
		applicationContext = SpringApplication.run(StartApplication.class, args);
  • 优点:可以通过正则去匹配目标类型的完全限定名,一个表达式可以过滤很多对象;

不同场景下按需配置即可,我遇到的问题是有那么几十个类有冲突,不想注入这些类,这时我使用正则过滤特定类的方法解决了我的问题。

SpringBoot项目中有时候某些不需要被 @ComponentScan注解给扫描到, 比如在给某个服务的Ribbon自定义配置时,为得防止 @Configuration注解所在的包与 @ComponentScan扫描的包重叠. 使用 @ComponeentScan 的 excludeFilters 属性进行设定我们需要排除. @ComponentScan(excludeFilters   在抽取公共swagger配置时,将swagger放入com.test.common.config包内,其他模块通过@ComponentScan进行进行引用,但有的模块在引用时,会扫描到common.config包路径下的其他配置而引发错误,如引用到RedisConfig而报错,此时需要将该排除掉。   通过@ComponentScan中的excludeFilters属性进行排除。 @SpringBootApplication @ComponentScan(basePackage
指定包扫描的根路径,让 Spring 来扫描指定包及子包下的组件。不过在上面的声明中有显式的指定了两个过滤条件: @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, c...
@ComponentScan过滤不需要的前言一、excludeFilters属性需要传递@ComponentScan.Filter注解二、示例指定排除指定排除注解自定义@ComponentScanIgnore实现过滤器自定义过滤器MyTypeFilter表达式总结 因为maven工程互相依赖,但是不需要依赖子项目的某些切面和配置,这时项目会配置@ComponentScan扫码子工程的包,由于启动的时候已经加载到了容器里面,于是就用上了@ComponentScan的excludeFilter
文章目录前因方式一方式二方式三方式四方式五方式六总结 我们都知道component-scan在springmvc或者springboot中可以扫描包路径,但是我们如何使用里面的属性排除不需要扫描的? 使用spring的xml配置方式实现,这个是基本功,知道这种方式,那么注解方式就容易理解了 <!-- 定义项目扫描包的路径,并且排除ApplicationContextConfig和WebSpringMVCServletConfig--> <context:component-
使用@ComponentScan可以让Spring取扫描Bean并注册到Spring容器中,如果我们想对这扫描添加一定的限制可以使用过滤器。 package service; import org.springframework.stereotype.Service; import pojo.User; @Service public class UserService { public void printUser(User user){ System.out.println(
SpringBoot忽略某些自动配置 最近业务要求对接数据,需要连接第三方的数据库。但是他们的都是内网,只能通过前置机上部署我们的项目,由于 我们与第三方对接的处理都写在单独的服务里,如果来一个第三方,单独再写一个服务会很麻烦,不好管理,所以需要把 所有处理都写在已有的服务里,可是有个问题就是:这次需要把该服务放到指定的前置机上,本来是使用多数据源连接第 三方数据库,并且连接的有自己的 mysql、Redis,还会注册到 Eureka 上,直接放到前置机上,会报 Redis 和 找不 1、@ComponentScan注解作用 @ComponentScan用于扫描指定包下的,将标注有@Controller、@Service、@Repository、@Component4个注解其中一个的扫描到Spring容器,作为Spring 2、@ComponentScan使用实例 (1)项目结构 (2)标注有标注有@Controller、@Service、@Repository、@Component4
@ComponentScan中还有一些属性: //扫描的时候只扫描哪些指定的组件 ComponentScan.Filter[] includeFilters() default {}; //扫描的时候按照哪些规则排除指定的组件 ComponentScan.Filter[] excludeFilters() default {}; 2.1,excludeFilters MainConfig主配置
您可以使用`@ComponentScan`注解的`excludeFilters`属性来排除某个包下的加载。具体步骤如下: 1. 创建一个自定义的过滤,实现`org.springframework.core.type.filter.TypeFilter`接口,用于排除指定包下的加载。 ```java public class ExcludeFilter implements TypeFilter { private final String[] excludedPackage; public ExcludeFilter(String[] excludedPackage) { this.excludedPackage = excludedPackage; @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { for (String excluded : excludedPackage) { if (metadataReader.getClassMetadata().getClassName().startsWith(excluded)) { return true; return false; 2. 在`@ComponentScan`注解中添加`excludeFilters`属性,指定要排除的包路径及自定义的过滤。 ```java @Configuration @ComponentScan(basePackages = "com.example", excludeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, classes = ExcludeFilter.class)) public class AppConfig { // ... 在上述示例中,我们排除了`com.example`包及其子包下的所有加载。您可以按需修改`ExcludeFilter`中的逻辑,来满足您的实际需求。