Java Annotation with spring

Action.java

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {

    /**
     * 当前方法描述
     * @return 描述
     */
    String desc() default "";

}

使用

  • 接口定义:
public interface Demo {
    void method();
}
  • 实现:
@Component
@Action
public class DemoOne implements Demo{

    @Override
    public void method(){
    }   

}
@Component
@Action
public class DemoTwo implements Demo{

    @Transactional
    @Override
    public void method(){
    }   
}

container 获取

@Component
public class DemoContainer {

    // 将所有 Demo 的子类注入到列表中
    @Autowired
    private List<Demo> demoList;

    public void match() {
        for(Demo demo : demoList) {
            Action action = demo.getClass().getAnnotation(Action.class);
        }
    }

}

问题

会发现,当使用 @Transactional 注解的时候,是无法获取到对应的 @Action 注解的。

注解发现,这个类已经变成了 spring 的 CGLib 的代理类。

解决方案

想到的解决方法:

判断 Demo 实例的时候,如果为代理则进行强转,获取对应的 target。然后再次获取注解。

后来查了相关资料,注解如下调整即可。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Action {

    /**
     * 当前方法描述
     * @return 描述
     */
    String desc() default "";

}