AOP面向切面编程

指在程序运行期间,将某段代码动态的切入到指方法的指定位置进行运行的这种编程方式,即面向切面编程。

使用动态代理和反射

jdk默认的动态代理,如果目标对象没有实现任何接口,是无法为他创建代理对象的。

结构图
在这里插入图片描述

写配置

1)将目标类和切面类加入到ioc容器中

@Service @Component

2)还应该告诉Spring到底哪个是切面类@Aspect

@Before在目标方法之间运行 前置通知

@After在目标方法结束之后 后置通知

@AfterReturning在目标方法正常返回之后 返回通知

@AfterThrowing在目标方法抛出异常之后 异常通知

@Around:环绕 环绕通知

execution

returning 告诉Spring那个用来接收返回值

throwing 告诉Spring哪个用来接收异常

@Before("execution(访问权限符 返回值 方法全类名(参数))")
@Before(value="execution(访问权限符 返回值 方法全类名(参数))",returning="")

3)开启基于注解的AOP给功能

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
cglib为没有接口的组件也可以创建代理对象
切入点表达式

1)匹配一个或多个字符

2)匹配任意一个参数

3)只能匹配一层路径

4)权限位置*不能 权限位置不写就行 public【可选的】

1)匹配任意多个参数,和任意类型参数

2)匹配任意多层路径

&& || !

JoinPoint
public static void xx(JoinPoint joinPoint)

JoinPoint :封装了当前目标方法的详细信息

getArgs 获取到目标方法运行时使用的参数

getSignature 获取到方法签名

Spring对通知方法的要求不严格

唯一要求的 就是方法的参数列表一定不能乱写,参数表上的每一个参数,Spring都得知道是什么

抽取可重用的切点表达式

1.声明一个没有实现的返回void的空方法

2.给方法上标注@Pointcut注解

@Pointcut("execution()")
public void test(){};

3.对应注解使用方法名即可

@Before("test")
环绕通知

是Spring中最强大的通知。

四合一通知就是环绕通知

@Around("test")
public Object myAround (ProceedingJoinPoint pjp) thorws Throwable{
 Object[] args=pjp.getArgs();
 String name=pjp.getSignature().getName();
 Object proceed=null;
    try{
        1
        proceed=pjp.proceed(args);
        2
    }catch(e)
    {
        3 
            throw new xx (e);
    }finally{
        4
    }
 return proceed;
}

环绕通知:是优先于普通通知执行

环绕前置–普通前置–目标方法执行–环绕正常返回/出现异常–环绕后置–普通后置

多切面运行顺序

在这里插入图片描述

1)@Order(1)//使用Order改变切面顺序 数值越小优先级越高

2)按照字典序

AOP使用场景

1)日志

2)做权限验证

3)安全检查

4)事务控制

基于注解的AOP

1.将目标类和切面类都加入到ioc容器中

2.告诉Spring哪个是切面类

3.在切面类中使用五个通知注解来配置切面中的这些通知方法都何时何地运行

4.开启基于注解的AOP功能

<bean  id="" class=""></bean>
<aop:config>
    <!--指定切面-->
<aop:aspect ref="">
    <aop:before method="" pointcut=""></aop:before>
    </aop:aspect>
</aop:config>
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐