2

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

以下是该课程的示例

@Component
@Transactional
public class someClass {

    @EventListener
    public void someMethod() {

    }
}

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

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

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

4

1 回答 1

3

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

于 2013-01-19T08:49:12.567 回答