上一节我们实现了Spring的基于XML的AOP。
Spring的基于 XML的AOP的实现
我们将测试一下上一节的代码执行结果
/*测试aop的配置*/
public class AOPTest {
public static void main(String[] args) {
//1.获取容器
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//2.获取对象
IAccountService as=(IAccountService)ac.getBean("accountService");
//3.执行方法
as.saveAccount();
as.updateAccount(1);
as.deleteAccount();
}
}
只有保存输出了,其他都没有输出,原因就是切入点表达式配置死了,就是保存,但是通常情况下我们是会对业务层所有方法进行增强,但不是每个方法都写一遍。
切入点表达式的写法
关键字:execution(表达式)
表达式:访问修饰符 返回值 包名.包名....类名.方法名(参数列表)
标准表达式写法
public void com.yujie.service.impl.AccountServiceImpl.saveAccount();
我们的切入点表达式明确的说明了这个方法要对哪个方法进行增强。
访问修饰符可以省略
void com.yujie.service.impl.AccountServiceImpl.saveAccount();
返回值可以使用通配符表示任意返回值,即void可以改为*
包名可以使用通配符来表示任意包,但是有几级包就需要写几个*,比如有4个包,就写*.*.*.*.
包名可以使用..表示当前包及其子包
* *..AccountServiceImpl.saveAccount()表示任意包下的只要有一个AccountServiceImpl类都会被增强
类名和方法名都可以使用*来实现通配。
如果写成这样* *..*.*(),也只会有两个方法被执行。因为有一个方法有参数。
参数列表
可以直接写数据类型:
基本类型直接写名称 int
引用类型写包名.类名的方式 java.lang.String
可以使用通配符表示任意类型,但是必须有参数* *..*.*(*)
当我们把参数写成..表示参数有无都可以,即真正的全通配写法
全通配写法
* *..*.*(..)
实际开发中切入点表达式的通常写法
切到业务层实现类的所有方法
* com.yujie.service.impl.*.*(..)
<!--配置通知的类型,并且建立通知方法-->
<aop:before method="printLog" pointcut="execution(* *..*.*())"></aop:before>
<!--配置通知的类型,并且建立通知方法-->
<aop:before method="printLog" pointcut="execution(* *..*.*(int))"></aop:before>
<aop:before method="printLog" pointcut="execution(* *..*.*(*))"></aop:before>
<aop:before method="printLog" pointcut="execution(* *..*.*(..))"></aop:before>
在实际开发中,最好不要写成这种全通配的方式,否则你程序在执行的时候所有类的方法都满足于这个条件,增强代码就都执行了一遍,这样肯定不是我们所需要的。
实际开发中切入点表达式的通常写法
切到业务层实现类的所有方法
* com.yujie.service.impl.*.*(..)