第十九章 基于注解的AOP编程
1.基于注解的AOP编程步骤
-
原始对象
-
额外功能
-
切入点
-
组装切面
将2 3 4步放在切面类中: 定义切面类: @Aspect 定义额外功能: @Around 原始方法的运行: ProceedingJoinPoint.proceed() 定义切入点: @Around(* login(..))
package com.dong.aspect; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @Aspect public class MyAspect { @Around("execution(* login(..))") public Object around(ProceedingJoinPoint point) throws Throwable { System.out.println("----Aspect log--------"); Object ret = point.proceed(); return ret; } }
<!--原始对象--> <bean id="userService" class="com.dong.aspect.UserServiceImpl"/> <!-- 切面 1.额外功能 2.切入点 3.组装切面 --> <bean id="around" class="com.dong.aspect.MyAspect"/> <!--告知Spring基于注解进行AOP编程--> <aop:aspectj-autoproxy/>
2.细节
-
切入点复用
//在切面类中定义一个函数,加上注解@Pointcut 将切入点函数提取出来,利于切入点的复用 @Aspect public class MyAspect { @Pointcut("execution(* login(..))") public void myPointcut() { } @Around(value = "myPointcut()") public Object around(ProceedingJoinPoint point) throws Throwable { System.out.println("----Aspect log--------"); Object ret = point.proceed(); return ret; } public Object around2(ProceedingJoinPoint point) throws Throwable { System.out.println("----new Aspect log------"); Object ret = point.proceed(); return ret; } }
-
动态代理的创建方式
AOP的底层实现 动态代理的两种创建方式 1. JDK 2. CGlib 默认情况下,AOP编程,底层应用JDK动态代理创建方式 如果切换CGlib 1. 基于注解的AOP开发 <aop:aspectj-autoproxy proxy-target-class="true"/> false是默认情况,使用JDK创建代理对象 2. 传统的AOP开发 <aop:config proxy-target-class="true">