SpringBoot配置自定義包掃描
項目中正在拆分微服務,需要把一個maven模塊,拆分成2個服務,要根據不同的包的路徑,來啟動不同的服務,因此就使用了自定義的包掃描,代碼如下:
/**
* @author WGR
* @create 2021/8/2 -- 12:26
*/
@Slf4j
public class FwTypeFilter implements TypeFilter, EnvironmentAware {
private String packageScane;
/**
* 根據配置文件中的package.scan類型,實現動態包掃描
* 此處不會通過注入的方法引入Environment,因為正在處於掃描階段,還沒有往IOC容器中注入bean
* @param metadataReader
* @param metadataReaderFactory
* @return
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {
//獲取當前正在掃描的類的類信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
String className = classMetadata.getClassName();
try {
Class<?> beanClass = ClassUtils.forName(className, FwTypeFilter.class.getClassLoader());
String packageName = beanClass.getPackage().getName();
if("scene".equals(packageScane)){
if(packageName.contains(".scene.mvc")){
return true;
}
}else if("system".equals(packageScane)){
if(!packageName.contains(".scene.mvc")){
return true;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return false;
}
@Override
public void setEnvironment(Environment environment) {
packageScane = environment.getProperty("package.scan");
log.info("========加載{}服務===========",packageScane);
}
}
在啟動類上加上自定義的過濾配置
@ComponentScan(value = {"com.thingjs.framework.feignServer"},
//此處為自定義的掃描規則
includeFilters = {@ComponentScan.Filter(type= FilterType.CUSTOM,classes={FwTypeFilter.class}),
//下面是公共的依賴
@ComponentScan.Filter(type= FilterType.REGEX,pattern="com.thingjs.framework.feignServer.config.*")
}
,useDefaultFilters = false)
