我有一组扩展抽象类Executor
的类。让我们说这些类是ExecutorOne
,ExecutorTwo
和ExecutorThree
。然后,我有第四类扩展Executor
类型,ExecutorFour
,但也实现了接口NotUsable
。
我使用Spring 4.x将所有上述bean的实例注入到列表中。
@Autowired
private final List<Executor> executors;
是否有任何机制允许我不在列表ExecutorFour
中注入executors
类型的bean?我希望列表executors
只包含三个bean,分别为ExecutorOne
,ExecutorTwo
和ExecutorThree
。
我试着看看@Conditional
注释,但似乎在这种情况下没用。
提前致谢。
还有另一种选择,它有助于实现您的尝试,但不会直接回答问题。
Spring没有像这样的排除机制,毕竟,所有4个bean都是有效的spring bean并且已经创建。
但是,您可以使用Usable
界面,而不是NotUsable
标记界面。这是一个(几乎不言自明)的例子:
interface Executor {}
interface UsableExecutor extends Executor {}
class Executor1 implements UsableExecutor{...}
class Executor2 implements UsableExecutor{...}
class Executor3 implements UsableExecutor{...}
class Executor4 implements Executor {} // note, doesn't implement UsableExecutor
@Component
class SomeClassWithUsableExecutors {
private final List<UsableExecutor> usableExecutors;
// an autowired constructor - only 3 elements will be in the list
public SomeClassWithUsableExecutors(List<UsableExecutor> usableExecutors) {
this.usableExecutors = usableExecutors;
}
}
虽然Spring没有为@Autowired
提供“排除这些类”语法,但它以@Qualifier
的形式提供了“包括这些类”的支持。
这种方法的工作方式是创建一个自定义限定符,您将在类级别应用于您希望在运行时成为Executor
的@Autowired
类。 Spring完成剩下的工作以确保不需要的类不会进入列表:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Usable {
String value();
}
@Autowired
@Usable
private final List<Executor> executors;
以上现在做的是只有Executor
类与自定义@Usable
限定符将注入executors