首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Spring连接未在列表中实现标记接口的bean

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

Stack Overflow用户
提问于 2018-09-11 05:34:54
回答 2查看 220关注 0票数 3

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
private final List<Executor> executors;

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

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

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-12 03:57:56

还有另一种选择,它可以帮助你实现你所尝试的,但不会直接回答这个问题。

Spring没有这样的排除机制,毕竟,所有4个bean都是有效的spring并被创建。

但是,您可以使用Usable接口,而不是NotUsable标记接口。下面是一个(几乎不言自明的)示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
   } 
}
票数 2
EN

Stack Overflow用户

发布于 2018-09-11 19:28:52

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

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

  1. 创建自定义限定符,应用于所需的类: @目标值({ElementType.FIELD})@RetentionPolicy.RUNTIME@限定符公共@接口可用{ String值();}
  2. 在注入点处应用限定符: @Autowired @可供使用的私人最终遗嘱执行人;

上面所做的是,只有具有自定义@Usable限定符的@Usable类才会注入到executors中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52277196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文