我为类创建了自己的注释:@MyAnnotation
,并用它注释了两个类。
我还在Spring的@Transactional
这些类中注释了一些方法。根据{{3}},bean工厂实际上将我的类包装成代理。
最后,我使用以下代码检索带注释的bean。
getBeansWithAnnotation
正确返回我声明的bean。 好。 @Transactional
属性已找到且有效。MyAnnotation
。 为。我希望我可以无缝地从实际的类或代理中读取这个注释。如果bean是代理,我怎样才能找到实际类的注释?
我应该使用什么而不是AnnotationUtils.findAnnotation()
来获得所需的结果?
Map<String,Object> beans = ctx.getBeansWithAnnotation(MyAnnotation.class);
System.out.println(beans.size());
// prints 2. ok !
for (Object bean: services.values()) {
System.out.println(bean.getClass());
// $Proxy
MyAnnotation annotation = AnnotationUtils.findAnnotation(svc.getClass(), MyAnnotation.class);
//
// Problem ! annotation is null !
//
}
答案 0 :(得分:10)
您可以通过调用AopProxyUtils.ultimateTargetClass找到代理bean的真实类。
确定 给定bean实例的最终目标类,不遍历 只有一个顶级代理,但任何数量的嵌套代理也是如此 尽可能长的没有副作用,也就是说,只为单身人士 目标
答案 1 :(得分:8)
解决方案不是处理bean本身,而是要求应用程序上下文。
使用方法ApplicationContext#findAnnotationOnBean(String,Class)。
Map<String,Object> beans = ctx.getBeansWithAnnotation(MyAnnotation.class);
System.out.println(beans.size());
// prints 2. ok !
for (Object bean: services.values()) {
System.out.println(bean.getClass());
// $Proxy
/* MyAnnotation annotation = AnnotationUtils.findAnnotation(svc.getClass(), MyAnnotation.class);
// Problem ! annotation is null !
*/
MyAnnotation annotation = ctx.findAnnotationOnBean(beanName, MyAnnotation.class);
// Yay ! Correct !
}