Исключить подпакеты из весенней автопроводки?
есть ли простой способ исключить пакет / подпакет из autowiring весной 3.1?
например, если бы я хотел включить сканирование компонентов с базовым пакетом com.example
есть ли простой способ исключить com.example.ignore
?
(почему? Я хотел бы исключить некоторые компоненты из моих интеграционных тестов)
8 ответов:
Я не уверен, что вы можете исключить пакеты явно с помощью
, но я уверен, что использование фильтра регулярных выражений эффективно приведет вас туда: <context:component-scan base-package="com.example"> <context:exclude-filter type="regex" expression="com\.example\.ignore\..*"/> </context:component-scan>
чтобы сделать его аннотационным, вы бы аннотировали каждый класс, который вы хотели исключить для интеграционных тестов, с чем-то вроде @com.образец.аннотация.Исключено из тестов. Тогда компонент-сканирование будет выглядеть так:
<context:component-scan base-package="com.example"> <context:exclude-filter type="annotation" expression="com.example.annotation.ExcludedFromITests"/> </context:component-scan>
это яснее, потому что теперь вы задокументировали в самом исходном коде, что класс не является предназначен для включения в контекст приложения для интеграционных тестов.
Я использую
@ComponentScan
как показано ниже для того же варианта использования. Это то же самое, что BenSchro10 это!--5--> 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); } }
на Весна 4 Я использую следующие
(Я публикую его, поскольку вопрос 4 года и больше людей используют Spring 4, чем Spring 3.1):@Configuration @ComponentScan(basePackages = "com.example", excludeFilters = @Filter(type=FilterType.REGEX,pattern="com\.example\.ignore\..*")) public class RootConfig { // ... }
это работает весной 3.0.5. Итак, я думаю, что это будет работать в 3.1
<context:component-scan base-package="com.example"> <context:exclude-filter type="aspectj" expression="com.example.dontscanme.*" /> </context:component-scan>
Кажется, вы сделали это через XML, но если бы вы работали в New Spring best practice, ваша конфигурация была бы на Java, и вы могли бы исключить их следующим образом:
@Configuration @EnableWebMvc @ComponentScan(basePackages = "net.example.tool", excludeFilters = {@ComponentScan.Filter( type = FilterType.ASSIGNABLE_TYPE, value = {JPAConfiguration.class, SecurityConfig.class}) })
Я думаю, что вы должны рефакторинг пакетов в более удобной иерархии, так что они находятся вне базового пакета.
но если вы не можете сделать это, попробуйте:
<context:component-scan base-package="com.example"> ... <context:exclude-filter type="regex" expression="com\.example\.ignore.*"/> </context:component-scan>
здесь вы можете найти больше примеров: использование фильтров для настройки сканирования
одна вещь, которая, кажется, работает для меня-это:
@ComponentScan(basePackageClasses = {SomeTypeInYourPackage.class}, resourcePattern = "*.class")
или в XML:
<context:component-scan base-package="com.example" resource-pattern="*.class"/>
по умолчанию
resourcePattern
что это"**/*.class"
.это казалось бы наиболее типобезопасным способом включить только ваш базовый пакет, так как этот resourcePattern всегда будет одинаковым и относительно вашего базового пакета.
вы также можете использовать @SpringBootApplication, который в соответствии с документацией Spring выполняет ту же функцию, что и следующие три аннотации: @настройки, @EnableAutoConfiguration @ComponentScan в одной аннотации.
@SpringBootApplication(exclude= {Foo.class}) public class MySpringConfiguration {}