Вы можете реализовать пользовательский TypeFilter , чтобы отключить ComponentScan
для определенных пакетов на основе активного профиля. Пример запуска:
(1) Реализация фильтра. Для демонстрации я жестко кодирую, что если активный профиль dev
, он исключит пакет, настроенный с помощью свойства devExcludePackage
. Для профиля prod
он исключит пакет, настроенный как prodExcludePackage
:
public class ExcludePackageTypeFilter implements TypeFilter , EnvironmentAware {
private Environment env;
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException {
boolean match = false;
for (String activeProfile : env.getActiveProfiles()) {
if (activeProfile.equals("dev")) {
match = isClassInPackage(metadataReader.getClassMetadata(), env.getProperty("devExcludePackage"));
} else if (activeProfile.equals("prod")) {
match = isClassInPackage(metadataReader.getClassMetadata(), env.getProperty("prodExcludePackage"));
}
}
return match;
}
private boolean isClassInPackage(ClassMetadata classMetadata, String pacakage) {
return classMetadata.getClassName().startsWith(pacakage);
}
@Override
public void setEnvironment(Environment environment) {
this.env = environment;
}
}
(2) Настройте application.properties
, чтобы определить, какие пакеты следует исключить для разных профилей.
devExcludePackage = com.example.prod
prodExcludePackage = com.example.dev
(3) Примените этот фильтр к @ComponentScan
:
@SpringBootApplication
@ComponentScan(excludeFilters = @ComponentScan.Filter(
type = FilterType.CUSTOM, classes = { ExcludePackageTypeFilter.class }))
public class Application {
}