使用Spring连接未在列表中实现标记接口的bean

问题描述 投票:3回答:2

我有一组扩展抽象类Executor的类。让我们说这些类是ExecutorOneExecutorTwoExecutorThree。然后,我有第四类扩展Executor类型,ExecutorFour,但也实现了接口NotUsable

我使用Spring 4.x将所有上述bean的实例注入到列表中。

@Autowired
private final List<Executor> executors;

是否有任何机制允许我不在列表ExecutorFour中注入executors类型的bean?我希望列表executors只包含三个bean,分别为ExecutorOneExecutorTwoExecutorThree

我试着看看@Conditional注释,但似乎在这种情况下没用。

提前致谢。

java spring dependency-injection autowired
2个回答
2
投票

还有另一种选择,它有助于实现您的尝试,但不会直接回答问题。

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;
   } 
}

1
投票

虽然Spring没有为@Autowired提供“排除这些类”语法,但它以@Qualifier的形式提供了“包括这些类”的支持。

这种方法的工作方式是创建一个自定义限定符,您将在类级别应用于您希望在运行时成为Executor@Autowired类。 Spring完成剩下的工作以确保不需要的类不会进入列表:

  1. 创建自定义限定符,以应用于所需的类: @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface Usable { String value(); }
  2. 在注射点应用您的限定符: @Autowired @Usable private final List<Executor> executors;

以上现在做的是只有Executor类与自定义@Usable限定符将注入executors

© www.soinside.com 2019 - 2024. All rights reserved.