Spring的@Transactional注释是否会破坏其他注释

时间:2013-01-19 08:24:54

标签: java spring

我有一个自定义方法注释(@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?后发现了这一点 - 似乎创建了某种代理,这似乎会导致我的注释“消失”。有没有办法获得原始类的引用?

1 个答案:

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