• Spring AOP(一)


    介绍

    AOP,aspect oriented programing,面向切面编程。
    动态代理:基于JDK和基于第三方cglib

    spring aop内置了两种技术的实现。

    spring aop支持方法级别的增强。

    • Joinpoint(连接点):可以被拦截的点
    • Pointcut(切入点):被拦截的点
    • Advice(通知/增强):对连接点进行改变
    • Target(目标对象):代理的目标对象
    • Aspect(切面):切入点和通知的结合

    使用

    1、配置pom.xml

    <!--aop依赖jar-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>
    

    2、配置文件的约束

    <?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:context="http://www.springframework.org/schema/context"
           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/context
            http://www.springframework.org/schema/context/spring-context.xsd 
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd">
    </beans>
    

    3、配置通知

    <bean id="account" class="com.my.entity.Account>
    <bean id="accountAspect" class="com.myentity.AccountAspect">
    <!--AOP配置-->
    <aop:config>
        <!--配置全局切入点-->
        <!--<aop:pointcut id="" expression=""/>-->
        <!--配置切面-->
        <aop:aspect id="myAspect" ref="accountAspect">
            <!--配置切面属性:通过通知标签描述切入点-->
            <aop:before method="myBefore" pointcut-ref="pt"/>
            <aop:after-returning method="myAfterReturning" pointcut-ref="pt"/>
            <aop:after-throwing method="myThrowing" pointcut-ref="pt"/>
            <aop:after method="myAfter" pointcut-ref="pt"/>
            <!--配置局部切入点:只能当前切面使用-->
            <aop:pointcut id="pt" expression="execution(public void com.yaroange.service.impl.UserServiceImpl.addUser(java.lang.Integer))"/>
        </aop:aspect>
    </aop:config> 
    

    通知类型

    https://www.cnblogs.com/chuijingjing/p/9806651.html

    (1)前置通知:before

    在目标方法执行之前执行执行的通知。

    前置通知方法,可以没有参数,也可以额外接收一个JoinPoint,Spring会自动将该对象传入,代表当前的连接点,通过该对象可以获取目标对象 和 目标方法相关的信息。

    注意,如果接收JoinPoint,必须保证其为方法的第一个参数,否则报错。

    (2)后置通知:after-returning

    在目标方法执行之后执行的通知。

    在后置通知中也可以选择性的接收一个JoinPoint来获取连接点的额外信息,但是这个参数必须处在参数列表的第一个。

    (3)异常通知:after-throwing

    在目标方法抛出异常时执行的通知

    可以配置传入JoinPoint获取目标对象和目标方法相关信息,但必须处在参数列表第一位

    另外,还可以配置参数,让异常通知可以接收到目标方法抛出的异常对象。

    (4)最终通知:after

    是在目标方法执行之后执行的通知。

    和后置通知不同之处在于,后置通知是在方法正常返回后执行的通知,如果方法没有正常返-例如抛出异常,则后置通知不会执行。

    而最终通知无论如何都会在目标方法调用过后执行,即使目标方法没有正常的执行完成。

    另外,后置通知可以通过配置得到返回值,而最终通知无法得到。

    最终通知也可以额外接收一个JoinPoint参数,来获取目标对象和目标方法相关信息,但一定要保证必须是第一个参数。

    (5)环绕通知:arround

    在目标方法执行之前和之后都可以执行额外代码的通知。

    在环绕通知中必须显式的调用目标方法,目标方法才会执行,这个显式调用时通过ProceedingJoinPoint来实现的,可以在环绕通知中接收一个此类型的形参,spring容器会自动将该对象传入,注意这个参数必须处在环绕通知的第一个形参位置。

    要注意,只有环绕通知可以接收ProceedingJoinPoint,而其他通知只能接收JoinPoint。

    环绕通知需要返回返回值,否则真正调用者将拿不到返回值,只能得到一个null。

    环绕通知有控制目标方法是否执行、有控制是否返回值、有改变返回值的能力。

    环绕通知虽然有这样的能力,但一定要慎用,不是技术上不可行,而是要小心不要破坏了软件分层的“高内聚 低耦合”的目标。

    切入点表达式

    用来匹配被增强的方法

    execution([修饰符] 返回值类型 包名.类名.方法名(参数))
    //全匹配方式
    public void com.yaorange.service.impl.AccountServiceImpll.saveAccount(com.yaorange.entity.Account)
    
    • 访问修饰符可以省略
    • 返回值可以使用*,表示任意返回值
    • 包名可以使用*,表示任意包,但是有几级包,需要写几个*
    • 使用..来表示当前包及其子包
    • 类名可以使用*,表示任意类
    • 方法名可以使用*,表示任意方法
    • 参数列表可以使用*,表示参数可以是任意类型,但是必须有参数
    • 参数列表可以使用..,表示有无参数均可,有参数可以是任意类型

    全通配方式:

    * *..*.*.*(..)
    

    实际常用:

    * com.mystudy.service.impl.*.*(..)
    
  • 相关阅读:
    git常用命令大全
    谷粒商城遇到的问题
    谷粒商城Seata(四十一)
    通过VMware Horizon Client访问虚拟机
    Qt 让窗口(或控件)居中
    QT 设置QDockWidget的初始大小
    Qt QDockWidget小结
    Qt QDockWidget停靠窗相关的信号
    Qt 基于Qt的词典开发系列--无边框窗口的缩放与拖动
    Qt 创建停靠悬浮窗口 QDockWidget
  • 原文地址:https://www.cnblogs.com/heibaimao123/p/13798611.html
Copyright © 2020-2023  润新知