我有一个自定义方法注释(@EventListener),我在具有@Transactional注释的类中的方法中使用。
以下是班级的样本
@Component
@Transactional
public class someClass {
@EventListener
public void someMethod() {
}
}
该类在包中包含在上下文文件组件扫描中。在另一个实现ApplicationContextAware的类中,如果它们有@EventListener注释,我会检查类的方法。出于某些奇怪的原因,当类中存在@Transactional时,我的自定义注释将丢失。
这是我检查方法注释的方法:
public Object postProcessAfterInitialization(Object bean,String beanName)抛出BeansException {
System.out.println("SCANNING :::::: " + beanName);
for (Method method : bean.getClass().getMethods()) {
for(Annotation a : method.getAnnotations()) {
System.out.println("\t>>>>> " + a.toString());
}
...
有没有办法使用@Transactional而不会弄乱它注释的类中的其他方法注释?
编辑:我在发布Spring - @Transactional - What happens in background?后发现了这一点 - 似乎创建了某种代理,这似乎会导致我的注释“消失”。有没有办法获得原始类的引用?
答案 0 :(得分:2)
我找到了问题的答案并在此处发布,以防其他人遇到同样的问题。由于@Transactional类是代理的,我需要获取原始的代理类,所以我添加了以下内容:
Class clazz;
// if this was proxied by Spring, get the original class name
clazz = AopUtils.getTargetClass(bean);
if(clazz == null) {
clazz = bean.getClass();
}
for (Method method : clazz.getMethods()) {
我使用AopUtils.getTargetClass会获得原始类,如果返回null则表示该类未被代理,所以我只使用bean.getClass()