最近这几天在公司研究spring aop(面向切面编程),在使用spring 注解实现时,遇到了一个bug,由此记录一下,方便日后读阅;报错如下图所示:
由于是第一次接触spring aop 当时就懵逼了,在网上搜索相关的错误,最后找到了自己的问题出在哪里;
我这里出错的原因是因为在使用注解定义切面对象的切入点时,没有使用spring aop中的 execution()的表达式导致出现这样的错误,一开始的代码如下:红色部分出错
@Aspect
// 声明该类是切面类
@Component
// 配置文件中启动自动扫描功能,将该切面交给spring 去管理
public class Transaction {
// 定义切点
@Pointcut(" com.bjsd.aop.service.*.*(..)")
public void allMethod() {
};
/**
* 在核心业务执行前执行,不能阻止核心业务的调用。
*
* @param joinPoint
*/
@Before("allMethod()")
private void doBefore(JoinPoint joinPoint) {
System.out.println("-----doBefore().invoke-----");
System.out.println(" 此处意在执行核心业务逻辑前,做一些安全性的判断等等");
System.out.println(" 可通过joinPoint来获取所需要的内容");
System.out.println("-----End of doBefore()------");
}
}
修改方法:在使用注解定义切入点时要使用
execution()表达式去匹配我们程序中的哪个包中的哪个类的哪个方法被定义为切入点。
修改后的代码:
@Aspect
// 声明该类是切面类
@Component
// 配置文件中启动自动扫描功能,将该切面交给spring 去管理
public class Transaction {
// 定义切点
@Pointcut("execution(* com.bjsd.aop.service.*.*(..))")
public void allMethod() {
};
/**
* 在核心业务执行前执行,不能阻止核心业务的调用。
*
* @param joinPoint
*/
@Before("allMethod()")
private void doBefore(JoinPoint joinPoint) {
System.out.println("-----doBefore().invoke-----");
System.out.println(" 此处意在执行核心业务逻辑前,做一些安全性的判断等等");
System.out.println(" 可通过joinPoint来获取所需要的内容");
System.out.println("-----End of doBefore()------");
}
}
最后问题解决;哪位朋友有不同的见解,欢迎留言,大家共同进步!