【问题标题】:Programatically find the qualifier annotation value of a bean以编程方式查找 bean 的限定符注释值
【发布时间】:2020-04-30 04:07:45
【问题描述】:

我有一个自动装配类型列表的课程

Class A{
   @Autowired
   List<Super> supers;
}

@Qualifier("B")
Class BSuperImpl implements Super{....}

@Qualifier("C")
Class CSuperImpl implements Super{....}

@Qualifier("D")
Class DSuperImpl  implements Super{....}

现在我想在 A 类中编写一个代码,在那里我可以根据下面的限定符查看 bean,而无需让我的 bean 知道上下文。使用 Spring MVC 4.3

Class A {

   @Autowired
   List<Super> supers;

   void process(String str){
       // Code to do supers.applyMethod(getTheBeanWithQualifierAs(str));
      }
}

【问题讨论】:

  • supers 据我了解是List。请分享如何拨打applyMethod()的详细信息?

标签: spring annotations autowired qualifiers


【解决方案1】:

物有所值

@Service
public class A {

    @Autowired
    List<Super> supers;

    void process(String str) {
        for(Super sup : supers) {
            if(str.equals((sup.getClass().getAnnotation(Qualifier.class).value()))){
                // executes when the bean qualifier name and str matches.
            }
        }

    }
}

---- 又一次尝试 ----

界面

public interface Super {
    String getQualifier();
}

示例实现

@Service
@Qualifier(BSuperImpl.QUALIFIER)
public class BSuperImpl implements Super {

    static final String QUALIFIER = "B";

    @Override
    public String getQualifier() {
        return QUALIFIER;
    }

}

一个

@Service
public class A {

    @Autowired
    Map<String,Super> supers;

    void process(String str) {
        System.out.println(supers);
        for(String beanName : supers.keySet()) {
            if(str.equals(supers.get(beanName).getQualifier())){
                // execute the logic 
            }
        }
    }
}

当不是通过依赖注入从容器中需要一个 bean 时,您将需要以一种或另一种方式引用应用程序上下文。

在这种方法中,@Qualifier 的使用实际上不是必需的。 map 的使用是为了展示 beanName 也可以作为参数传递给方法的可能性。

【讨论】:

  • 感谢您的解决方案它可以工作,但我正在寻找一些“弹簧框架方式”
  • 忽略我的更新。我刚刚意识到要求是让 bean 不知道上下文。
  • 您没有使用上下文,您的解决方案有效,但我正在寻找一些春天的方式来找到它。
  • 啊,不是这样,我删除了中间的更新。出于好奇,我正在尝试不同的方法:)
猜你喜欢
  • 2015-06-14
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2014-11-18
相关资源
最近更新 更多