【问题标题】:Does Spring's @Transactional annotation mess up other annotationsSpring的@Transactional注解是否会混淆其他注解
【发布时间】:2013-01-19 08:24:54
【问题描述】:

我有一个自定义方法注释 (@EventListener),我在具有 @Transactional 注释的类内的方法中使用它。

以下是该类的示例

@Component
@Transactional
public class someClass {

    @EventListener
    public void someMethod() {

    }
}

该类在包含在上下文文件组件扫描中的包中。在另一个实现 ApplicationContextAware 的类中,我检查类的方法是否有我的 @EventListener 注释。出于某种奇怪的原因,当类中存在@Transactional 时,我的自定义注释丢失了。

这是我检查方法注释的方式:

public Object postProcessAfterInitialization(Object bean, String beanName) throws 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? 后发现了这一点 - 似乎创建了某种代理,这似乎会导致我的注释“消失”。有没有办法获得对原始类的引用?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    我找到了我的问题的答案并将其发布在这里,以防其他人遇到同样的问题。由于@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()

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 2015-11-17
      • 1970-01-01
      • 2019-02-18
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      相关资源
      最近更新 更多