Как исключить пакет в заданном профиле времени выполнения в приложении Spring Boot - PullRequest
0 голосов
/ 26 января 2019

В моем приложении у меня есть два профиля dev и prod, я могу исключить бины, используя аннотацию org.springframework.context.annotation.Profile:

package com.example.prod;

@Service
@Profile("prod")
public class MyService implements MyBaseService {}

Проблема в том, что у меня есть несколько бинов, аннотированных в такихКстати, все они в одной упаковке com.example.prod.Подобная структура существует для профиля dev (пакет com.example.dev), и, возможно, в будущем у меня будут дополнительные профили.Есть ли возможность исключить весь пакет сразу?Я пытался поиграть с org.springframework.context.annotation.ComponentScan, но мне не удалось добавить фильтры исключения, зависит от фактического профиля, интересно, есть ли простой способ решить мою проблему.

1 Ответ

0 голосов
/ 26 января 2019

Вы можете реализовать пользовательский 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 {


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...