通常通知不起作用有以下两个原因,这两个原因全都被我碰到了,都是一些不容易发现的点:
-
切入点表达式书写错误,仔细看看自己的类名包名有咩有拼写错误。
表达式的原型是:execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
解释:
modifiers-pattern 访问权限类型
ret-type-pattern 返回值类型
declaring-type-pattern 包名类名
name-pattern 方法名(参数类型和参数个数)
throws-pattern 抛出异常类型
? 可选* 0至多个任意字符
.. 用在方法参数中,表示任意多个参数 用在包名后,表示当前包及其子包路径
+ 用在类名后,表示当前类及其子类 用在接口后,表示当前接口及其实现类以下给出一个切入点表达式的例子,用作练习:
execution(public * *(..))
代表任意公共方法
execution(* * ..SomeServiceImpl.do*(..))
代表任意返回类型 任意包及其子包下的SomeServiceImpl类中的以do开头的所有方法,参数任意, 而且..
之后不能加空格,否则会报错。 -
还有可能是在创建测试类时,用了接口的实现类强制转换成接口,比如下面的形式:
NumberService service = (NumberServiceImpl)ctx.getBean("numberService");
将接口的实现类强制转换成接口,这样是不对的.
因为你只要实现了接口,就可以使用这个接口的所有方法,操作上是不需要进行转换的.可以仔细想一想,某个实现类应该是不能强制转换成接口的,因为接口的范围更大一些,某个实现类范围小,这样转换是不合适的.有哪位大神知道原理的话,欢迎跟我们分享一下呀!
而正确的做法应该是:
NumberService service = (NumberService)ctx.getBean("numberService");
这样你的通知就能起作用了.