У меня есть компонент , который я хочу , чтобы исключить из @ComponentScan
в частности @Configuration
:
@Component("foo") class Foo {
...
}
В противном случае он, похоже, конфликтует с каким-то другим классом в моем проекте. Я не совсем понимаю конфликт, но если я закомментирую @Component
аннотацию, все будет работать так, как я хочу. Но другие проекты, которые полагаются на эту библиотеку, ожидают, что этим классом будет управлять 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
, то получаю странную ошибку о невозможности загрузить какой-то, казалось бы, случайный класс:
Вызвано: java.io.FileNotFoundException: ресурс пути к классу [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 {}
Но это, похоже, не исключает компонент из сканирования, как я хочу.
Как мне это исключить?
источник
Использование явных типов в фильтрах сканирования для меня некрасиво. Я считаю, что более элегантный подход - создать собственную аннотацию маркера:
@Retention(RetentionPolicy.RUNTIME) public @interface IgnoreDuringScan { }
Отметьте компонент, который следует исключить вместе с ним:
@Component("foo") @IgnoreDuringScan class Foo { ... }
И исключите эту аннотацию из сканирования компонентов:
@ComponentScan(excludeFilters = @Filter(IgnoreDuringScan.class)) public class MySpringConfiguration {}
источник
@Component
, но я не думаю, что вопрос задает именно этоДругой подход - использовать новые условные аннотации. Начиная с простого 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) вы можете использовать следующие условные аннотации:
@ConditionalOnBean
@ConditionalOnClass
@ConditionalOnExpression
@ConditionalOnJava
@ConditionalOnMissingBean
@ConditionalOnMissingClass
@ConditionalOnNotWebApplication
@ConditionalOnProperty
@ConditionalOnResource
@ConditionalOnWebApplication
Таким образом можно избежать создания класса Condition. Дополнительные сведения см. В документации Spring Boot.
источник
Если вам нужно определить два или более критерия excludeFilters , вы должны использовать массив.
Для экземпляров в этом разделе кода я хочу исключить все классы в пакете org.xxx.yyy и другой конкретный класс MyClassToExclude
@ComponentScan( excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.xxx.yyy.*"), @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = MyClassToExclude.class) })
источник
У меня возникла проблема при использовании @Configuration , @EnableAutoConfiguration и @ComponentScan при попытке исключить определенные классы конфигурации, дело в том, что это не сработало!
В конце концов я решил проблему, используя @SpringBootApplication , который, согласно документации Spring, выполняет те же функции, что и три приведенных выше, в одной аннотации.
Еще один совет: сначала попробуйте без уточнения сканирования пакетов (без фильтра basePackages).
@SpringBootApplication(exclude= {Foo.class}) public class MySpringConfiguration {}
источник
В случае исключения тестового компонента или тестовой конфигурации Spring Boot 1.4 представил новые тестовые аннотации
@TestComponent
и@TestConfiguration
.источник
Мне нужно было исключить аудит @Aspect @Component из контекста приложения, но только для нескольких тестовых классов. В итоге я использовал @Profile («аудит») для класса аспекта; включая профиль для обычных операций, но исключая его (не помещайте его в @ActiveProfiles) в определенных тестовых классах.
источник