关于Spring AOP注解报错:warning no match for this type name: *** [Xlint:invalidAbsoluteTypeName] ,今天找了好一会儿,结果发现时pointcut的表达式写错了,这里记录一下。
场景是需要给某些方法加上日志。
代码简化如下:
定义接口:
package ...
public interface Sample(){
public void func1(Sting arg1, String arg2);
public void func2(Sting arg1, String arg2);
}
定义实现类:
package ...
import ......
public class SampleImpl implements Sample(){
@Override
public void func1(String arg1, String arg2){
System.out.println(arg1 + "--" + arg2);
}
@Override
public void func2(String arg1, String arg2){
System.out.println(arg1 + "==" + arg2);
}
}
定义切片:
package ...
import ......
@Aspect
public class LogPointcut(){
private Log log = LogFactory.getLog(this.getClass());
// 前置通知
@Before("execution(* XXX.XXX.Sample.func1(..))")
public void logBefore(JoinPoint joinPoint){
log.info("前置通知,方法" + joinPoint.getSinature().getName() + "() 即将被执行!");
}
}
这里要注意一下,表达式“execution(* XXX.XXX.Sample.func1(..))”中,第一个星号表示的是匹配任意修饰符:private,protected,public。
如果这个类和Sample在同一个包,可以不用写全名,如果在不同的包,需要把包名都加上,否则就会找不到Sample。报本文第一行所说的异常。
如果要切所有的方法,只要把func1用“*”替换。
配置比较简单:
<beans xmlns="...."
...
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:sehcmeLocation="......
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<aop:aspectj-autoproxy />
<bean id="sample" class=".....SampleImpl"/>
<bean class=".....LogPointcut"/>
</beans>
最后在main方法中引用:
.....
public static void main(String[] args) {
....
Sample sample = (Sample) context.getBean("sample");
sample.func1("test", "123");
}
这样差不多算是完成了。