2013-01-19 79 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()