Spring的組件掃描注解


通過在類上加注解 @ComponentScan 來掃描 Spring 的組件類。

@ComponentScan 的可選參數

  • basePackages:指定需要掃描的根包目錄,其子目錄也會被掃描,默認路徑為 @ComponentScan 注解類目錄,及其子目錄
  • value:basePackages 的別名
  • basePackageClasses:指定需要掃描的根類目錄,其子目錄也會被掃描
  • lazyInit:是否懶加載,默認 false
  • useDefaultFilters:是否啟用自動掃描組件,默認 true;false 表示只應用下面指定的過濾規則
  • excludeFilters:指定不需要掃描的組件類型(詳見 @Filter 配置)
  • includeFilters:指定需要掃描的組件類型(詳見 @Filter 配置)
  • scopedProxy:代理模式 ScopedProxyMode
    • DEFAULT:默認,一般就是 NO
    • NO:不需要創建代理
    • INTERFACES:創建 JDK 代理
    • TARGET_CLASS:利用 CGLIB 創建代理
  • nameGenerator:指定實現了接口 BeanNameGenerator 的類,可以用來定義 BeanName 的生成規則
  • scopeResolver:指定實現了接口 AnnotationScopeMetadataResolver 的類,可以配置作用域 scope,和代理模式 scopedProxy
  • resourcePattern:用來匹配合適的組件,默認為 **/*.class,推薦使用 includeFilters 和 excludeFilters

配置多個 @ComponentScan 的方法

下面三種方式都可以

@ComponentScans(
    @ComponentScan({"com.xxx.aaa","com.xxx.bbb"})
)
@Configuration
public class Config {}
@ComponentScan({"com.xxx.aaa","com.xxx.bbb"})
@Configuration
public class Config {}
@ComponentScan({"com.xxx.aaa"})
@ComponentScan({"com.xxx.bbb"})
@Configuration
public class Config {}

配置過濾器 @Filter

1、過濾 @Service 注解類

@Configuration
@ComponentScan(
    excludeFilters = {
        @Filter(type = FilterType.ANNOTATION, classes = Service.class)
    }
)
public class Config {}

2、過濾 Dog 類

@Configuration
@ComponentScan(
    excludeFilters = {
        @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Dog.class)
    }
)
public class Config {}

3、正則匹配,過濾后綴為 a 的類

@Configuration
@ComponentScan(
    excludeFilters = {
        @Filter(type = FilterType.REGEX, pattern = {"..*a"})
    }
)
public class Config {}

4、自定義過濾規則類,過濾包含 a 的類

@Configuration
@ComponentScan(
    excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = MyFilterType.class)
    }
)
public class Config {}
// 實現 TypeFilter 自定義規則:過濾包含 a 的 BeanName
public class MyFilterType implements TypeFilter 自定義規則 {
  @Override
  public boolean match(MetadataReader reader, MetadataReaderFactory factory) throws IOException {
    return reader.getClassMetadata().getClassName().contains("a");
  }
}

一個例子

配置類 Config,有如下規則:

  1. 需要掃描包路徑com.xxx.aaacom.xxx.bbb
  2. 排除com.xxx.aaa路徑下的@Service注解類和Dog
  3. com.xxx.bbb不啟用自動掃描,但是需要包含Cat
@ComponentScan(
    value = {"com.xxx.aaa"},
    excludeFilters = {
        @Filter(type = FilterType.ANNOTATION, classes = Service.class),
        @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Dog.class)
    }
)
@ComponentScan(
    value = {"com.xxx.bbb"},
    useDefaultFilters = false,
    includeFilters = {
        @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Cat.class)
    }
)
@Configuration
public class Config {
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM