当前位置: 首页 > 知识库问答 >
问题:

我如何找到所有带有自定义注释的bean,并将其注入bean-manager的映射?

锺离飞飙
2023-03-14

我有一些这样的豆子:

@MyAnnotation(type = TYPE1)
@Component
public class First implements Handler {

@MyAnnotation(type = TYPE2)
@Component
public class Second implements Handler {

@MyAnnotation(type = TYPE3)
@Component
public class Third implements Handler {
@Component
public class BeanManager {

    private Map<Type, Handler> handlers = new HashMap<>();

    @Override
    public Handler getHandler(Type type) {
        Handler handler = map.get(type);
        if (handler == null)
            throw new IllegalArgumentException("Invalid handler type: " + type);
        return handler ;
    }
}
public BeanManager(First first, Second second, Third third){
  handlers.put(Type.TYPE1, first);
  handlers.put(Type.TYPE2, second);
  handlers.put(Type.TYPE3, third);
 }
    @PostConstruct
    public void init(){
       Map<String, Object> beansWithAnnotation = context.getBeansWithAnnotation(MyAnnotation.class);
       //get type from annotation
       ...
      //add to map
      handlers.put(type, bean);
     }

3)移动将在bins中搜索注释移动到BeanPostProcessor,并将setter添加到BeanManager:

@Component
public class MyAnnotationBeanPostProcessor implements BeanPostProcessor {

    private final BeanManager beanManager;

    public HandlerInAnnotationBeanPostProcessor(BeanManager beanManager) {
        this.beanManager = beanManager;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        Annotation[] annotations = bean.getClass().getAnnotations();
        for (Annotation annotation : annotations) {
            if (annotation instanceof MyAnnotation) {
                Type[] types = ((MyAnnotation) annotation).type();
                for (Type type: types) {
                    beanManager.setHandler(type, (Handler) bean);
                }
            }
        }
        return bean;
    }
}

但是在这个解决方案中,我不喜欢Sethandler方法。

共有1个答案

邵璞
2023-03-14

让我们稍微改变一下

@Component
public class BeanManager {

    private Map<Type, Handler> handlers = new HashMap<>();

    //haven't tested, just an idea : )
    @Autowired
    public void setHandler(List<Handler> handlersList) {
        for(Handler handler : handlers) {
            Type type = handler.getClass().getAnnotation(MyAnnotation.class).type();
            handlers.put(type, handler);
        }
    }
}

如果你需要更多的灵感,请查看这个链接

 类似资料:
  • 我有这个spring配置: 如何获取用Foo注释的所有bean的列表? 注意:

  • 问题内容: 我有这个春天的配置: 如何获得所有带有注释的bean的列表? 注意:是我定义的自定义注释。它不是“官方” Spring注释之一。 [编辑]按照Avinash T.的建议,我编写了这个测试案例: 但是失败了。为什么? 问题答案: 一对夫妇spring专家的帮助下,我找到了一个解决方案:的属性可以。这个接口有一个我可以用来获取bean方法的注释的方法:

  • 我已经用自定义注释注释了Spring bean,但似乎Spring在创建bean后删除了我的自定义注释。 第二步不行,我的自定义注释丢失了。(可能是到期的代理文件) 我的豆子 我的一个自定义注释的示例 findAndDoStuffWithAnnotatedThings Bean中出错的内容被传递到一个类,在该类中,我的自定义注释得到验证,但我的验证程序找不到任何注释。(Util使用isAnnota

  • 问题内容: 使用基于注释的配置(等)是否可以实现相同的bean继承? http://docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/spring-framework- reference/htmlsingle/#beans-child-bean- definitions 问题答案: java config中没有抽象bean的概念,因为Java语言已经

  • 使用基于注释的配置(等)是否可以实现相同的bean继承? http://docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#beans-child-bean-definitions

  • 我已经使用Spring几十年了,但以前从未遇到过这个用例。 是否有方法注入所有带特定注释的bean,例如,所有带服务的bean或所有带自定义注释的bean? 我唯一的想法是注入上下文,获取所有bean并手动过滤。如果这是唯一的方法,Spring是否公开了一种递归扫描类层次结构以查找(元)注释的方法(因为大多数Spring注释都可以用作元注释)?