2013-01-19 55 views
1

我有一个自定义方法注释(@EventListener),我在具有@Transactional注解的类中的方法中使用。Spring的@Transactional注解搞砸了其他注释

下面是类

@Component 
@Transactional 
public class someClass { 

    @EventListener 
    public void someMethod() { 

    } 
} 

的类是在封装中包括在上下文文件组件扫描的样品。在另一个实现了ApplicationContextAware的类中,如果他们有我的@EventListener注解,我会检查这些类的方法。出于某种奇怪的原因,当@Transactional存在于类中时,我的自定义注释会丢失。

这是我的检查方法注释:

公共对象postProcessAfterInitialization(对象豆,字符串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? - 似乎创建了一种代理,这似乎会导致我的注释“消失”。有没有办法获得对原始类的引用?

回答

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()