如何以@AspectJ风格在Java文件中编写注解继承切面代码?
解答:将传统AspectJ声明注解切面转为Java注解式写法
嘿,这个问题我刚好踩过类似的坑!答案是可以实现的,但你遇到的写法不生效问题,确实是因为AspectJ 1.5.3版本里的@DeclareAnnotation还处于未完全实现的状态,升级到AspectJ 1.6及以上版本后,这个注解就能正常工作了。
正确的转换写法
把你原来的传统AspectJ切面代码:
public aspect AnnotationInheritor { declare @method : void ItemRepository+.getById(..) : @MyAnnotation; }
转换成Java注解式的写法,只需要用@DeclareAnnotation来替代原来的declare @method声明,具体代码如下:
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.DeclareAnnotation; @Aspect public class AnnotationInheritor { @DeclareAnnotation( value = "@MyAnnotation", targets = "@method(void ItemRepository+.getById(..))" ) public void declareMyAnnotationOnGetById() {} }
必须注意的几个关键点
- 版本一定要升级:1.5.x系列的AspectJ里
@DeclareAnnotation是个半成品,很多场景下都不生效,这是官方早期版本的已知问题,换成1.6及以上版本就没问题了。 - 要用AspectJ编译器编译:普通的
javac不认识AspectJ的这类增强注解,必须用AspectJ自带的ajc编译器,或者在Maven/Gradle里配置对应的AspectJ插件来处理编译。 - 切点表达式要对应:
@DeclareAnnotation的targets参数写法要和原来declare @method里的表达式完全一致,这样才能精准匹配到ItemRepository及其子类的getById方法。
临时替代方案(如果没法升级版本)
要是暂时没法升级AspectJ版本,也可以用@Around切面结合反射手动给目标方法添加注解,但这种方式不仅繁琐,运行时还会有额外开销,远不如@DeclareAnnotation简洁高效,所以还是优先升级版本更靠谱。
内容的提问来源于stack exchange,提问作者VB_
相关产品推荐
相关产品推荐

