исключить @Component из @ComponentScan

У меня есть компонент, который я хочу исключить из @ComponentScan в конкретную @Configuration :

 @Component("foo") class Foo { ... } 

В противном случае, похоже, он сталкивается с каким-то другим classом в моем проекте. Я не совсем понимаю столкновение, но если я прокомментирую аннотацию @Component , все работает так, как я хочу. Но другие проекты, которые полагаются на эту библиотеку, ожидают, что этот class будет управляться Spring, поэтому я хочу пропустить его только в моем проекте.

Я попытался использовать @ComponentScan.Filter :

 @Configuration @EnableSpringConfigured @ComponentScan(basePackages = {"com.example"}, excludeFilters={ @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class)}) public class MySpringConfiguration {} 

но он, похоже, не работает. Если я попытаюсь использовать FilterType.ASSIGNABLE_TYPE , я получаю странную ошибку в том, что не могу загрузить какой-то, казалось бы, случайный class:

Причина: java.io.FileNotFoundException: ресурс пути classа [junit / framework / TestCase.class] не может быть открыт, потому что он не существует

Я также попытался использовать type=FilterType.CUSTOM следующим образом:

 class ExcludeFooFilter implements TypeFilter { @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { return metadataReader.getClass() == Foo.class; } } @Configuration @EnableSpringConfigured @ComponentScan(basePackages = {"com.example"}, excludeFilters={ @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class)}) public class MySpringConfiguration {} 

Но это, похоже, не исключает компонент из сканирования, как я хочу.

Как я могу исключить его?

Конфигурация выглядит хорошо, за исключением того, что вы должны использовать excludeFilters вместо excludes :

 @Configuration @EnableSpringConfigured @ComponentScan(basePackages = {"com.example"}, excludeFilters={ @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class)}) public class MySpringConfiguration {} 

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

 public @interface IgnoreDuringScan { } 

Отметьте компонент, который следует исключить из него:

 @Component("foo") @IgnoreDuringScan class Foo { ... } 

И исключить эту аннотацию из сканирования компонентов:

 @ComponentScan(excludeFilters = @Filter(IgnoreDuringScan.class)) public class MySpringConfiguration {} 

Другой подход – использовать новые условные annotations. Поскольку простая Spring 4 вы можете использовать @Conditional аннотацию:

 @Component("foo") @Conditional(FooCondition.class) class Foo { ... } 

и определить условную логику для регистрации компонента Foo:

 public class FooCondition implements Condition{ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // return [your conditional logic] } } 

Условная логика может быть основана на контексте, потому что у вас есть доступ к фабрике bean. Например, когда компонент «Бар» не зарегистрирован в качестве компонента:

  return !context.getBeanFactory().containsBean(Bar.class.getSimpleName()); 

С Spring Boot (должен использоваться для КАЖДОГО нового проекта Spring) вы можете использовать эти условные annotations:

  • @ConditionalOnBean
  • @ConditionalOnClass
  • @ConditionalOnExpression
  • @ConditionalOnJava
  • @ConditionalOnMissingBean
  • @ConditionalOnMissingClass
  • @ConditionalOnNotWebApplication
  • @ConditionalOnProperty
  • @ConditionalOnResource
  • @ConditionalOnWebApplication

Вы можете избежать создания classа условий таким образом. Дополнительную информацию см. В документах Spring Boot.

В случае, если вам необходимо определить два или более критерия excludeFilters , вы должны использовать массив.

Для экземпляров в этом разделе кода я хочу исключить все classы в пакете org.xxx.yyy и другой определенный class, MyClassToExclude

  @ComponentScan( excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.xxx.yyy.*"), @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = MyClassToExclude.class) }) 

У меня возникла проблема при использовании @Configuration , @EnableAutoConfiguration и @ComponentScan , пытаясь исключить определенные classы конфигурации, дело в том, что это не сработало!

В конце концов я решил проблему, используя @SpringBootApplication , которая, согласно документации Spring, выполняет те же функции, что и три выше в одной annotations.

Другой совет – сначала попробовать, не уточняя сканирование пакетов (без фильтра basePackages).

 @SpringBootApplication(exclude= {Foo.class}) public class MySpringConfiguration {} 

В случае исключения тестового компонента или конфигурации теста Spring Boot 1.4 представил новые тестовые annotations @TestComponent и @TestConfiguration .

Мне нужно было исключить аудит @Aspect @Component из контекста приложения, но только для нескольких тестовых classов. Я закончил использование @Profile («аудит») в classе аспект; включая профиль для обычных операций, но исключая его (не помещайте его в @ActiveProfiles) на конкретные тестовые classы.

  • Как импортировать Java-config-class в XML-config, чтобы оба контекста имели компоненты?
  • Весенние данные и исходный запрос с разбивкой на страницы
  • Инъекция Мокито издевается над весенним бобаном
  • Как использовать Spring Security без сеансов?
  • Как регистрировать HttpRequest и HttpResponse в файле?
  • @Value не разрешается при использовании annotations @PropertySource. Как настроить PropertySourcesPlaceholderConfigurer?
  • Можно ли настроить SpringMVC для обработки всех запросов, но исключить каталоги статического содержимого?
  • Как java-настроить отдельные источники данных для весенних пакетных данных и бизнес-данных? Должен ли я это сделать?
  • Spring Autowiring class vs. interface?
  • Как использовать Spring перехватчики Hibernate в Spring Boot?
  • Как я могу зарегистрировать глобальный настраиваемый редактор в Spring-MVC?
  • Давайте будем гением компьютера.