1.引入Jar包
2.引入配置文件
3.编写切面类配置
4.使用注解的AOP对象目标类进行增强
5.在配置文件中开启以注解形式进行AOP开发
<!-- AOP开启注解 -->
<aop:aspectj-autoproxy/>
6.在切面类上添加注解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- AOP开启注解 -->
<aop:aspectj-autoproxy/>
<bean id="goodsDao" class="pers.liuchengyin.demo1.GoodsDaoImpl"></bean>
<bean id="goodsaspect" class="pers.liuchengyin.demo1.GoodsDaoAspect"></bean>
</beans>
@Aspect
public class GoodsDaoAspect {
@Before(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.save(..))")
public void log(){
System.out.println("日志");
}
}
注解AOP通知类型
@Before前置通知
@AfterReturning后置通知
1.没有返回值
2.有返回值
@AfterReturning(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.update(..))",returning = "res")
public void afterreturning(Object res){
System.out.println(res);
}
@Around环绕通知
@Around(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.delete(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("之前");
Object proceed = joinPoint.proceed();
System.out.println("之后");
return proceed;
}
@AfterThrowing异常抛出通知
1.没有获取异常信息
2.获取异常信息
@AfterThrowing(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.find(..))",throwing = "ex")
public void afterThrowing(Throwable ex){
System.out.println("异常抛出:" + ex);
}
@After最终通知
@After(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.find(..))")
public void after(){
System.out.println("最终通知");
}
AOP的注解切入点的配置
有时候一个方法要添加前置通知对又要添加异常通知,又要添加最终通知。可以在切面当中定义好切入点,在通知当中直接使用定义好的切入点表达式。
@AfterThrowing(value = "GoodsDaoAspect.pointcut()",throwing = "ex")
public void afterThrowing(Throwable ex){
System.out.println("异常抛出:" + ex);
}
@After(value = "GoodsDaoAspect.pointcut()")
public void after(){
System.out.println("最终通知");
}
@Pointcut(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.find(..))")
public void pointcut(){
}
定义多个切入点
一个通知同时定义到多个方法当中
@Pointcut(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.find(..)) || execution(* pers.liuchengyin.demo1.GoodsDaoImpl.delete(..))")
public void pointcut(){
System.out.println("多个");
}
当使用接口时与不使用接口内部代理区别
使用接口 - 内部采用的是Jdk的代理
不使用接口 - 内部才用的是cglib的代理