Как весна @EnableAutoConfiguration, но исключить некоторые пакеты из сканирования компонентов? [Дубликат]

С ES5 + (любой просматриваемый в настоящее время - 2017) вы должны иметь возможность делать

[].forEach.call(document.getElementsByClassName('answer'), function(el) {
    el.style.color= 'red';
});

61
задан richarbernal 24 May 2012 в 09:00
поделиться

8 ответов

Я не уверен, что вы можете явно исключить пакеты с помощью фильтра & lt; exclude-filter & gt ;, но я уверен, что использование фильтра регулярных выражений эффективно приведет вас туда:

 <context:component-scan base-package="com.example">
    <context:exclude-filter type="regex" expression="com\.example\.ignore\..*"/>
 </context:component-scan>

Чтобы сделать его аннотацией, вы должны аннотировать каждый класс, который вы хотели исключить для тестов интеграции, с чем-то вроде @ com.example.annotation.ExcludedFromITests. Тогда компонент-сканирование будет выглядеть так:

 <context:component-scan base-package="com.example">
    <context:exclude-filter type="annotation" expression="com.example.annotation.ExcludedFromITests"/>
 </context:component-scan>

Это понятно, потому что теперь вы сами документировали в самом исходном коде, что класс не предназначен для включения в контекст приложения для тестов интеграции.

72
ответ дан Jonathan W 20 August 2018 в 16:11
поделиться

Кажется, вы сделали это через XML, но если вы работали в новой лучшей практике Spring, ваша конфигурация была бы на Java, и вы могли бы исключить их так:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "net.example.tool",
  excludeFilters = {@ComponentScan.Filter(
    type = FilterType.ASSIGNABLE_TYPE,
    value = {JPAConfiguration.class, SecurityConfig.class})
  })
9
ответ дан Arsalan Khalid 20 August 2018 в 16:11
поделиться
  • 1
    Хотя вы понимаете, что этот вопрос старше 4 лет, и его спросили специально на весну 3.1, верно? – Jonathan W 4 October 2016 в 15:30
  • 2
    @JonathanW Но, тем не менее, действительно полезный ответ для людей, пришедших на эту страницу из поиска в google – Stewart 28 June 2017 в 16:34

Я использую @ComponentScan следующим образом для одного и того же варианта использования. Это то же самое, что и ответ XMLSchro10's XML, но в этом используются аннотации. Оба используют фильтр с type=AspectJ

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration;
import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration;
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.example" },
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "com.example.ignore.*"))
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
45
ответ дан Community 20 August 2018 в 16:11
поделиться
  • 1
    Это правильный «современный» ответ – Paul Croarkin 10 February 2016 в 14:27
  • 2
    Может быть, это чисто ностальгия, но я действительно предпочитаю XML еще – Kirby 10 February 2016 в 17:53
  • 3
    это может быть я, но с весной 4.2 я должен использовать FilterType.REGEX для этого подхода – ThanksForAllTheFish 29 July 2016 в 14:54
  • 4
    Это то, что я хотел, но мне также пришлось использовать FilterType.REGEX. Может быть, ответ может быть обновлен, чтобы отразить это? – Adam 28 December 2017 в 19:23
  • 5
    Не стесняйтесь сделать новый ответ – Kirby 28 December 2017 в 22:22

Я думаю, вы должны реорганизовать свои пакеты в более удобной иерархии, поэтому они не входят в базовый пакет.

Но если вы не можете этого сделать, попробуйте:

<context:component-scan base-package="com.example">
    ...
    <context:exclude-filter type="regex" expression="com\.example\.ignore.*"/>
</context:component-scan>

Здесь вы можете найти другие примеры: Использование фильтров для настройки сканирования

4
ответ дан Dirk 20 August 2018 в 16:11
поделиться
  • 1
    Спасибо, в принципе я согласен с идеей рефакторинга ... это была моя первая мысль. К сожалению, это не очень хороший вариант для моей конкретной ситуации. – HolySamosa 23 May 2012 в 19:47
  • 2
    Хороший дизайн упаковки может избежать таких ситуаций, но если вы не можете ... вы не можете хахаха, :) – richarbernal 23 May 2012 в 19:50

Вы также можете использовать @SpringBootApplication , который, согласно документации Spring, выполняет те же функции, что и следующие три аннотации: @Configuration, @EnableAutoConfiguration @ComponentScan в одной аннотации.

@SpringBootApplication(exclude= {Foo.class})
public class MySpringConfiguration {}
2
ответ дан dorony 20 August 2018 в 16:11
поделиться

Это работает весной 3.0.5. Итак, я бы подумал, что это будет работать в 3.1

<context:component-scan base-package="com.example">  
    <context:exclude-filter type="aspectj" expression="com.example.dontscanme.*" />  
</context:component-scan> 
10
ответ дан Kirby 20 August 2018 в 16:11
поделиться
  • 1
    Помните, что он молча игнорирует исключение в случае, если aspectj отсутствует в classpath. – Vadzim 29 June 2017 в 16:17

Кажется, что для меня это работает:

@ComponentScan(basePackageClasses = {SomeTypeInYourPackage.class}, resourcePattern = "*.class")

Или в XML:

<context:component-scan base-package="com.example" resource-pattern="*.class"/>

Это переопределяет значение по умолчанию resourcePattern, которое является "**/*.class" .

Казалось бы, это самый безопасный тип для ТОЛЬКО включает ваш базовый пакет, поскольку этот ресурсPattern всегда будет таким же и относительно вашего базового пакета.

3
ответ дан leeor 20 August 2018 в 16:11
поделиться

Для Spring 4 я использую следующее (я отправляю его, поскольку вопрос 4 года, и больше людей используют Spring 4, чем Spring 3.1):

@Configuration
@ComponentScan(basePackages = "com.example", 
  excludeFilters = @Filter(type=FilterType.REGEX,pattern="com\\.example\\.ignore\\..*")) 
public class RootConfig {
    // ...
}
17
ответ дан Witold Kaczurba 20 August 2018 в 16:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: