• Spring 笔记三 AOP


    1、AOP 概述

      AOP (Aspect-Oriented  Programming,面向切面编程):是一种新的方法论,是对传统 OOP (Object-Oriented  Programming,面向对象编程)的补充。

      AOP 就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。

      作用:在程序运行期间,不修改源码对已有方法进行增强。

      优势:减少重复代码、提高开发效率、维护方便。

      实现方式:使用动态代理技术。

      涉及 AOP 的专业术语:

      

    2、AOP 的使用步骤

      【1】导包:6基础包+1切面基础包+3切面加强包

        spring-beans-4.0.0.RELEASE

        spring-context-4.0.0.RELEASE

        spring-core-4.0.0.RELEASE                                    com.springsource.net.sf.cglib-2.2.0

        spring-expression-4.0.0.RELEASE    +    spring-aspects-4.0.0.RELEASE    +      com.springsource.org.aopalliance-1.0.0   

        spring-aop-4.0.0.RELEASE                                  com.springsource.org.aspectj.weaver-1.6.8.RELEASE

        commons-logging-1.1.3

      【2】写配置

        1. 将目标类和切面类(封装了通知方法(在目标方法执行前后执行的方法))加入到ioc容器中。

          目标类:

          

          切面类

          

        2. 告诉Spring到底哪个是切面类 @Aspect

          切面类

          

        3. 告诉 Spring,切面类里面的每一个方法,都是何时何地运行;

          

        4. 开启基于注解的 AOP 模式

          

    3、细节

      【1】IOC 容器中保存的是组件的代理对象

        从 IOC 容器中拿到目标对象;注意:如果想要用类型,一定用他的接口类型,不要用它本类。

        AOP的底层就是动态代理,容器中保存的组件是他的代理对象;$Proxy12。当然不是本类的类型

        

        如果目标类没有接口怎么办?

          没有接口就是本类类型,可以通过本类类型拿,也可以通过本类 id 拿,id 值为类名首字母小写。

        

      【2】切入点表达式的写法

        固定格式:execution(访问权限符 返回值类型 方法全类名(参数表))

        通配符:两种

          * :

           1. 匹配一个或者多个字符

           2. 匹配任意一个参数

           3. 只能匹配一层路径

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

          .. :

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

           2. 匹配任意多层路径

        通配符总结:

          1. 最精确的:execution(public int com.atguigu.impl.CalculatorImpl.add(int,int))

          2. 最模糊的:execution(* *.*(..)),千万别这样写(见方法就切)

          3. 通用写法:execution(*  com.atguigu.impl.*.*(..))

      【3】通知方法的执行顺序:两种

        

        正常情况:@Before(前置通知)===== @After(后置通知)==== @AfterReturning(正常返回);

        异常情况:@Before(前置通知)===== @After(后置通知)==== @AfterThrowing(方法异常);

      【4】JoinPoint 获取目标方法的信息

        1、只需要为通知方法的参数列表上写一个参数 JointPoint  jointPoint,这个参数封装了当前目标方法的详细信息

        2、方法正常执行完成,如何获取返回值。returning="result";告诉 Spring 这个 result 用来接收返回值。

        

          3、方法执行处问题了,如何接异常信息?throwing="exception":告诉 Spring 哪个参数是用来接收异常。

        

      【5】Spring 对通知方法的约束

        1. Spring对通知方法的要求不严格,有无返回值,返回值类型不限制。

        2. 唯一要求的就是方法的参数列表一定不能乱写?因为通知方法是 Spring 利用反射调用的,每次方法调用得确定这个方法的参数表的值。

      【6】切入点表达式的重用

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

        2. 给方法上标注 @Pintcut 注解。

        

      【7】环绕通知

        环绕通知是 Spring 最强大的通知,四合一通知。

        

      【8】环绕通知执行顺序

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

        环绕前置===普通前置===目标方法执行===环绕返回/环绕异常===环绕后置===普通后置===普通返回/普通异常。

        细节:有异常环绕一定要把异常抛出去,这样才能被普通异常捕获,否则环绕有异常,环绕吃掉异常,普通正常返回,但没有返回值。

      【9】多切面运行顺序

        1. 不加环绕通知:

          1. 先进后出,谁里谁外看字幕顺序。

          2. 使用 @Order 注解,值小的先执行。

        

        

        2. 加环绕

          看环绕在那个切面类。环绕只是影响当前切面。

    4、AOP 使用场景

      【1】AOP 加日志保存到数据库

      【2】AOP 做权限验证

      【3】AOP 做安全检查

      【4】AOP 做事务控制

    5、基于 xml 配置的 AOP 写法

      【1】回顾基于注解的AOP

        1. 将目标类和切面类交给 Spring 管理,@Component、@Service

        2. 告诉 Spring 哪个是切面类,@Aspect

        3. 告诉 Spring 通知方法何时何地运行

        4. 开启注解

      【2】xml 写法

        1. 将目标类和切面类交给 Spring 管理

        

        2、3. 告诉 Spring 哪个是切面类,通知方法何时何地运行。

        

        细节:

          1. 切入点表达式可以写在通知方法内、切面类内方法外、切面类外。

          

      【注解和 xml 配置写法比较】

        1. 注解:快速方便

        2. xml 配置:功能完善,重要的用配置。

  • 相关阅读:
    Nginx 在 Linux 下安装与搭建集群
    php服务器环境安装及项目搭建
    安全运维 -- Linux服务器使用公私钥密匙证书登录
    Linux 使用nexus搭建maven私服
    lombok使用教程
    Java爬虫项目实战(一)
    CGI,FastCGI和PHP-FPM之间的关系和区别
    IPv6、双栈与隧道
    mysql时间戳转日期
    socket通讯原理及例程(一看就懂
  • 原文地址:https://www.cnblogs.com/_Moliao/p/13472885.html
Copyright © 2020-2023  润新知