代码之家  ›  专栏  ›  技术社区  ›  riccardo.cardin

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

  •  3
  • riccardo.cardin  · 技术社区  · 6 年前

    我有一组扩展抽象类的类 Executor . 假设这些类是 ExecutorOne , ExecutorTwo ExecutorThree . 然后,我有一个四年级的学生 遗嘱执行人 类型, ExecutorFour 同时实现接口 NotUsable .

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

    @Autowired
    private final List<Executor> executors;
    

    是否有任何机制允许我不注入类型为的bean 执行程序4 名单内 executors ?我想要名单 遗嘱执行人 仅包含三个bean,分别为 遗嘱执行人 , 执行二 执行程序3 .

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

    事先谢谢。

    2 回复  |  直到 6 年前
        1
  •  2
  •   riccardo.cardin    6 年前

    还有另一个选择,它有助于实现你所尝试的,但不能直接回答问题。

    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;
       } 
    }
    
        2
  •  1
  •   kolossus    6 年前

    尽管Spring没有为 @Autowired 它以 @Qualifier .

    它的工作方式是创建一个自定义限定符,您将在类级别应用于 Executor 你想要的课程 @自动售货机 在运行时。Spring会做其余的工作,以确保不需要的类不会进入列表:

    1. 创建自定义限定符,以应用于所需的类:

      @Target({ElementType.FIELD})
      @Retention(RetentionPolicy.RUNTIME)
      @Qualifier
      public @interface Usable {
          String value();
      }
      
    2. 在注入点应用限定符:

      @Autowired
      @Usable
      private final List<Executor> executors;
      

    上面所说的只是 遗嘱执行人 自定义类 @Usable 限定符将被注入 executors

    推荐文章