在运行时使用java.lang.annotation在Spring中检索bean

时间:2015-07-09 04:38:40

标签: java spring spring-mvc annotations

我有一个使用

检索的注释列表
java.lang.reflect.Method.getDeclaredAnnotations()

使用这些注释,如何检索标记的的spring bean 有这些注释吗?

伪代码:

public interface Work{...}

@Component
@A1
public class SpringBean1 implements Work{}

@Component
@A2
public class SpringBean2 implements Work{}

public class Test 
{

  public void doSomething() 
  {

    Annotation[] annotations = getAnnotationsListUsingReflection();

    for(Annotation annotation: annotations) 
    {
      Work work = /* Retrieve bean using annotation, how to do this? */
      work.xyz(); 
      ......
    }    

  }
}

1 个答案:

答案 0 :(得分:2)

假设您的注释是注释bean类型而不是它们的方法,您可以使用ListableBeanFactory#getBeanNamesForAnnotation(Class)

  

查找Class具有提供的Annotation类型的bean的所有名称,   没有创建任何bean实例。

AnnotationConfigApplicationContext是该界面的一个实现。

鉴于此类实例

AnnotationConfigApplicationContext ctx = ...;
String[] beanNames = ctx.getBeanNamesForAnnotation(Annotation.class);

然后遍历bean名称并获取每个bean

for (String beanName : beanNames) {
    Object bean = ctx.getBean(beanName);
    // use it
}

或者,ListableBeanFactory#getBeansWithAnnotation(Class)可以为您完成工作:

  

查找Class提供Annotation类型的所有bean,并返回   带有相应bean实例的Map个bean名称。