一、基于注解的AOP编程开发步骤

    1. 原始对象
    2. 额外功能
    3. 切入点
    4. 组装切面

    通过切面类 定义了额外功能:@Around
    定义了切入点: @Around(“execution(* login(..))”)

    1. /*
    2. * 1.额外功能
    3. * public class MyArround implements MethodInterceptor{
    4. * public Object invoke(MethodInvocation invocation){
    5. * Object ret = invocation.proceed();
    6. * return ret;
    7. * }
    8. * }
    9. * 2.切入点
    10. * <aop:config
    11. * <aop:pointcut id=" " expression="execution(* login(..))"/>
    12. * */
    13. @Aspect
    14. public class MyAspect {
    15. @Around("execution(* login(..))")
    16. public Object arround(ProceedingJoinPoint jointPoint) throws Throwable {
    17. System.out.println("---------aspect log---------");
    18. Object ret = jointPoint.proceed();
    19. return ret;
    20. }
    21. }

    二、细节

    1. 切入点复用

      1. //切入点复用:在切面类中定义一个函数,上面用@Pointcut注解,通过这种方式,定义切入点表达式,后续更加有利于切入点复用
      2. @Aspect
      3. public class MyAspect {
      4. @Pointcut("execution(* login(..))")
      5. public void myPointcut(){}
      6. @Around(value = "myPointcut()")
      7. public Object arround(ProceedingJoinPoint jointPoint) throws Throwable {
      8. System.out.println("---------aspect log---------");
      9. Object ret = jointPoint.proceed();
      10. return ret;
      11. }
      12. @Around(value = "myPointcut()")
      13. public Object arround1(ProceedingJoinPoint jointPoint) throws Throwable {
      14. System.out.println("---------aspect tx---------");
      15. Object ret = jointPoint.proceed();
      16. return ret;
      17. }
      18. }
    2. 动态代理的创建方式

    AOP底层实现,两种创建代理方式

    • JDK动态代理 Proxy.newProxyInstance() 通过接口创建代理的实现类
    • Cglib Enhancer 通过继承父类创建的接口类
      • 默认情况下,AOP编程,底层应用JDK动态代理创建方式,如果想切换为cglib,则部分标签更换如下

    基于注解时:<aop:aspectj-autoproxy proxy-target-class="true"/>
    传统方法时:

    1. <aop:config proxy-target-class="true">
    2. <!--效果:所有方法都作为切入点-->
    3. <aop:pointcut id="pc" expression="execution(* login(String,..))"/>
    4. <!--组装:把额外功能与切入点整合-->
    5. <aop:advisor advice-ref="around" pointcut-ref="pc"/>
    6. </aop:config>