通過在類上加註解 @ComponentScan 來掃描 Spring 的組件類。 @ComponentScan 的可選參數 basePackages:指定需要掃描的根包目錄,其子目錄也會被掃描,預設路徑為 @ComponentScan 註解類目錄,及其子目錄 value:basePackages 的 ...
通過在類上加註解 @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,有如下規則:
- 需要掃描包路徑
com.xxx.aaa
、com.xxx.bbb
- 排除
com.xxx.aaa
路徑下的@Service
註解類和Dog
類 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 {
}