使用AspectJ注解编程时,未添加"+"为何提示缺少")"?
AspectJ @DeclareParents注解问题解决
1. 不加"+"报错的原因
@DeclareParents的value属性遵循AspectJ类型匹配语法,直接写org.example..*时,AspectJ解析器会判定表达式不完整,触发"预期出现')'"的语法错误。这是因为@DeclareParents需要明确指向可实例化的具体类型,+符号在这里的作用是指定匹配目标类型的所有子类型(包括类的子类、接口的实现类),相当于明确告诉AspectJ要匹配包下所有可实例化的具体类,避免匹配到接口、抽象类这类无法实例化的类型。
2. 给org.example包下所有类添加引入的正确写法
如果你要给org.example包及其所有子包下的所有具体类引入GoodBye接口,有两种可行写法:
写法一:使用"+"匹配子类型
这是你当前用的写法,已经能满足需求:
package org.example; @Aspect @Order(value = 2) @Component public class SayAspect { // 匹配org.example包及子包下所有可实例化的具体类 @DeclareParents(value = "org.example..*+", defaultImpl = DefaultGoodBye.class) private GoodBye goodBye; private int count = 0; }
这里org.example..*+的含义是:
..:匹配org.example包及其所有子包*:匹配包下所有类型(类、接口等)+:匹配上述类型的所有子类型(即具体可实例化的类)
写法二:用条件过滤排除接口和抽象类
如果需要更精准控制(比如包下有接口/抽象类需要排除),可以用AspectJ的条件表达式:
@DeclareParents(value = "org.example..* && !isInterface() && !isAbstract()", defaultImpl = DefaultGoodBye.class) private GoodBye goodBye;
!isInterface()和!isAbstract()会过滤掉接口和抽象类,只匹配具体的可实例化类。
内容的提问来源于stack exchange,提问作者zhan
相关产品推荐
相关产品推荐

