一、基于注解的AOP编程开发步骤
- 原始对象
- 额外功能
- 切入点
- 组装切面
通过切面类 定义了额外功能:@Around
定义了切入点: @Around(“execution(* login(..))”)
/** 1.额外功能* public class MyArround implements MethodInterceptor{* public Object invoke(MethodInvocation invocation){* Object ret = invocation.proceed();* return ret;* }* }* 2.切入点* <aop:config* <aop:pointcut id=" " expression="execution(* login(..))"/>* */@Aspectpublic class MyAspect {@Around("execution(* login(..))")public Object arround(ProceedingJoinPoint jointPoint) throws Throwable {System.out.println("---------aspect log---------");Object ret = jointPoint.proceed();return ret;}}
二、细节
切入点复用
//切入点复用:在切面类中定义一个函数,上面用@Pointcut注解,通过这种方式,定义切入点表达式,后续更加有利于切入点复用@Aspectpublic class MyAspect {@Pointcut("execution(* login(..))")public void myPointcut(){}@Around(value = "myPointcut()")public Object arround(ProceedingJoinPoint jointPoint) throws Throwable {System.out.println("---------aspect log---------");Object ret = jointPoint.proceed();return ret;}@Around(value = "myPointcut()")public Object arround1(ProceedingJoinPoint jointPoint) throws Throwable {System.out.println("---------aspect tx---------");Object ret = jointPoint.proceed();return ret;}}
动态代理的创建方式
AOP底层实现,两种创建代理方式
- JDK动态代理 Proxy.newProxyInstance() 通过接口创建代理的实现类
- Cglib Enhancer 通过继承父类创建的接口类
- 默认情况下,AOP编程,底层应用JDK动态代理创建方式,如果想切换为cglib,则部分标签更换如下
基于注解时:<aop:aspectj-autoproxy proxy-target-class="true"/>
传统方法时:
<aop:config proxy-target-class="true"><!--效果:所有方法都作为切入点--><aop:pointcut id="pc" expression="execution(* login(String,..))"/><!--组装:把额外功能与切入点整合--><aop:advisor advice-ref="around" pointcut-ref="pc"/></aop:config>
