2016-11-01 3 views
1
@ComponentScan( //CS1 
    basePackages = {"com.package.A", "com.package.B"}, 
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, 
              value = {com.Package.A.SomeClass.class 
              }) 
) 

@ComponentScan( //CS2 
    basePackages = { "com.package.A"} 
) 
@EnableAutoConfiguration 
@SpringBootApplication 
public class Application { 
    public static void main(String[] args) throws Exception { 
    ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args); 
    } 
} 

Выше мой основной класс SpringBootApplication. Как вы можете видеть, я должен использовать Annnotation, а не xml. Есть две @ComponentScan аннотации. И это, конечно, запрещено для Весны. Для меня два разных @ComponentScan означают два разных способа запуска моего приложения. И если я решила использовать CS1 (это означает @ ComponentScan1), я хотел бы прокомментировать CS2 и наоборот.Как настроить динамику @ComponentScan?

Это не элегантный или изящный. Особенно для тех, кто новичок на весне. Итак, мне интересно узнать, как я могу настроить его динамически в соответствии с моим файлом .properties. Такой же параметр, как и в моем файле .properties под названием «isScanA», я могу использовать CS1. Или любой другой элегантный способ.

Я пробовал много.

  1. Используйте заполнитель. Например, @ComponentScan(basePackage="${scan.basePackage}"). И при необходимости измените значение в файле .properties. Но этот способ не может исправить excludeFilters. Потому что, если я использую FilterType.ASSIGNABLE_TYPE для назначения класса, который должен быть исключен, value должен быть Class, а не String, где, если используется value = {"${scan.excludeClass}"}.

  2. Программный путь.

    /** 
    * Create a new AnnotationConfigApplicationContext, scanning for bean definitions 
    * in the given packages and automatically refreshing the context. 
    * @param basePackages the packages to check for annotated classes 
    */ 
    public AnnotationConfigApplicationContext(String... basePackages) { 
        this(); 
        scan(basePackages); 
        refresh(); 
    } 
    

Я назвал этот метод в моем главном function.But он также не может исправить excludeFilters проблемы, причина здесь: Doing context:component-scan programatic way?

...

Я действительно пытался много, но все еще не могу исправить. Поэтому мне нужна твоя помощь.

Простите мой бедный английский, плз.

У вас много времени, по крайней мере, вы потратили немного времени на чтение.

+1

Почему вы хотите, чтобы даже сделать это? Похоже, вы пытаетесь исправить то, что вам не следует исправлять в первую очередь. –

+2

Посмотрите на профили пружин: они звучат точно так же, как вам нужно –

+0

@ M.Deinum На самом деле, я пытаюсь заменить систему rpc на прямой вызов в том же jvm. CS2 - это старый способ загрузки сервисного компонента, который поддерживается rpc.And. CS1 - это новый способ загрузки компонента сервиса, который можно вызвать в одном и том же jvm. Я просто хочу сделать два варианта для разработчика. Он может запустить приложение в режиме rpc или прямое calll.Это зависит от значения, которое он задал в файле .properties. Я думаю, что это более грациозно, чем комментировать коды. –

ответ

4

Возможно, вы ищете Spring's Profile! Профиль Spring позволяет вам определять профили для конфигураций и фасоли. Я думаю, вы должны разделить классы конфигурации на два профиля! Взгляните на эти примеры!

Вот документация:

http://docs.spring.io/autorepo/docs/spring-boot/current/reference/html/boot-features-profiles.html

+0

Thx. Я прочитал документ о Spring Profile. Это может помочь, я думаю. Thx снова. –

Смежные вопросы