补充:再此之前可以先了解AOP的开发(基于AspectJ的XML方式):
https://blog.csdn.net/sinat_41803693/article/details/108595405
步骤:1、引入jar包
基本开发包
AOP的包(aop、aspects、expression、aspectj[依赖包])
2、创建XML文件,引入约束(:the aop schema ..............方法参见he context schema约)
3、编写目标类。增强(save、find、delete、update方法)
4、编写测试类 (介绍一个单元测试的方法............)
注:大体与xml形式相同,与XML不同的地方就是在xml文件,以及编写目标类时利用的是注解的形式。
1、applicationContext.xml
<!-- 利用这个可以实现AOP的注解开发 --> <aop:aspectj-autoproxy/>
有一个proxy-target-class属性,默认为false,表示使用jdk动态代理织入增强,为true时,表示使用CGLib动态代理技术织入增强。不过即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用CGLib动态代理。
2、目标类MyAspect,增强save方法
2.1先了解,各种通知的注释写法:
@Aspect 定义切面类
@Before(value = "execution(* com.dao.OrderDao.save(..))") 前置增强
@AfterReturning 后置通知
@Around 环绕通知
@AfterThrowing 异常通知,出现异常程序执行结束
@After 最终通知,即使出现异常,最终通知还是会被执行
2.2实现save增强的demo,其他的各种通知可以仿造这个save方法的前置通知设置。
@Aspect
public class MyAspect {
@Before(value = "execution(* com.dao.OrderDao.save(..))")
public void before(){
System.out.println("前置增强............");
}
}
2.3 多个通知作用于一个方法
@Pointcut(value = "execution(* com.dao.OrderDao.save(..))")
private void piontcut1(){}
@Pointcut(value = "execution(* com.dao.OrderDao.delete(..))")
private void piontcut2(){}
声明一个方法,再引入这个方法即可。例如:
@Before(value = "MyAspect.piontcut1()")
public void before(){
System.out.println("前置增强............");
}
//切入点的注解
@Pointcut(value = "execution(* com.dao.OrderDao.save(..))")
private void piontcut1(){}
@Pointcut(value = "execution(* com.dao.OrderDao.delete(..))")
private void piontcut2(){}