东莞网页制作免费网站制作,上社网站建设,wordpress的asp版,合肥网络推广策划方案文章目录 一、什么是 Spring AOP二、为什么要使用 Spring AOP三、AOP 的一些应用场景四、AOP 的组成五、如何使用 Spring AOP六、Spring AOP 的实现原理6.1、JDK 和 CGLIB 的区别 一、什么是 Spring AOP
AOP (Aspect Oriented Programming) #xff1a;面向切面编程#xff… 文章目录 一、什么是 Spring AOP二、为什么要使用 Spring AOP三、AOP 的一些应用场景四、AOP 的组成五、如何使用 Spring AOP六、Spring AOP 的实现原理6.1、JDK 和 CGLIB 的区别 一、什么是 Spring AOP
AOP (Aspect Oriented Programming) 面向切面编程它是一种思想是对某一类事情(某一类问题)的集中处理。而 Spring AOP 是一个框架 提供了一种对AOP思想的实现它们的关系和 loC 与 DI 类似。
二、为什么要使用 Spring AOP
想象一个场景我们在做后台系统时除了登录和注册功能不需要做用户登录验证之外几乎其他所有页面调用前端控制器(Controller)都需要先验证用户登录的状态那这个时候我们要怎么处理呢?
之前的处理方式每个 Controller 都要写一遍用户登录验证但当实现的功能越来越多时要写的登录验证也越来越多但其实这些登陆验证的方法又是相同的这些相同的方法就会冗余的存在项目的各个地方导致代码修改和维护的成本很高。
这时候我们对于这种功能统一且使用的地方较多的功能就可以考虑使用 AOP 来统一处理。
就像之前我们使用 Spring 来写项目时就需要额外安装 Tomcat 才能将项目在浏览器上运行起来后来我们使用 SpringBoot 写项目SpringBoot 已经内置好了Tomcat我们就不需要额外安装 Tomcat 也能将项目在浏览器上运行起来。其实都是需要Tomcat来给项目的运行提供支持但Spring是需要手动安装而SpringBoot直接内置好了我们开发时就比较轻松、省事。
对于 Spring AOP 来说也是一样在没有使用Spring AOP之前像我们写的一些管理系统一般除了登录、注册页面能够在未登录之前访问其他界面都是要求登陆后用户含有权限时才能访问因此我们需要在项目里多个地方都要各自实现或调用用户验证的方法但使用了Spring AOP之后我们只需要在某一处配置一下所有需要判断用户登录页面(中的方法)就全部可以实现用户登录验证了不再需要每个方法中都写相同的用户登录验证了给我们带来了轻松、省事。
三、AOP 的一些应用场景
1、统一的用户登录判断 2、统一日志记录 3、统一方法执行时间统计 可以拿到所有执行的方法的执行时间可以很快的找到执行时间较慢的方法进行优化。 4、统一的返回格式设置 5、统一的异常处理 6、事务的开启和提交等
也就是说使用 AOP 可以扩充多个对象的某个能力所以 AOP 可以说是 OOP(Object OrientedProgramming面向对象编程)的补充和完善。
四、AOP 的组成
1、切面(Aspect) 切面(Aspect)由切点(Pointcut)和通知(Advice)组成它既包含了横切逻辑的定义也包括了连接点的定义。 即切面是包含了通知、切点和切面的类相当于AOP 实现的某个功能的集合。 通俗的理解切面在程序中就是一个处理某个具体问题的一个类。类里面包含了很多方法这些方法就是切点和通知。
2、切点(Pointcut) 切点相当于保存了众多连接点的一个集合(如果把切点看成一个表而连接点就是表中一条一条的数据)。 通俗的理解切点用来配置程序进行主动拦截的规则。 其实用户在地址栏输入一个URL时如果这个URL不是登录或注册此时用户的请求就会被程序拦截这个拦截不是说用户手动调用去拦截的而是程序感知到这个请求程序主动去拦截的那想要程序能够具备主动拦截的能力我们需要去配置那么怎么配置配置的规则是怎么样的就是切点的工作。
3、通知(Advice) 切面也是有目标的——它必须完成的工作。在 AOP 术语中切面的工作被称之为通知。 通俗的理解通知程序中被拦截的请求其触发的具体动作(即被拦截的请求它触发到的方法是做什么事)。就是在通知中实现具体的业务代码。通知就是切面(类)里的方法。
通知分为5类 a.前置通知 注解是 Before 在执行目标方法之前执行的方法叫做前置通知。 b.后置通知 注解是 After 在执行了目标方法之后执行的方法就叫做后置通知。 c.异常通知 注解是AfterThrowing 目标方法在执行时出现了异常时执行的通知。 d.返回通知 注解是AfterReturning 目标方法返回数据(return)时执行的通知。 e.环绕通知 注解是 Around 在目标方法执行的周期范围内(执行之前、执行中、执行后)都可以执行的方法叫做环绕通知。 4、连接点(Join Point) 可能会触发 AOP 规则的所有点(所有请求)。
五、如何使用 Spring AOP
1、添加 Spring AOP 框架的依赖
2、定义切面(创建切面类)
3、定义切点(配置拦截规则) Aspect 支持三种通配符 * 匹配任意字符只匹配一个元素(包,类,或方法方法参数) .. 匹配任意字符可以匹配多个元素在表示类时,必须和*联合使用 表示按照类型匹配指定类的所有类必须跟在类名后面如com.cad.Car表示继承该类的所有子类包括本身。
切点细节解析 切点表达式由切点函数组成其中execution()是最常用的切点函数用来匹配方法语法为 execution(修饰符返回类型包.类.方法(参数)异常)
修饰符一般省略 public 公共方法 * 任意
返回类型不能省略 void 返回没有值 String 返回值字符串 * 任意
包 com.gyf.crm 固定包 com.gyf.crm.*.service crm包下面子包任意例如com.gyf.crm.staff.service com.gyf.crm… crm包下面的所有子包含自己 com.gyf.crm.*.service… crm包下面任意子包固定目录serviceservice目录任意包
类 UserServiceImpl 指定类 *Impl 以Impl结尾
User * 以User开头
* 任意
方法名不能省略 addUser 固定方法 add* 以add开头 *Do 以Do结尾
* 任意
(参数) () 无参 (int) 一个整型 (int,int) 两个 (..) 参数任意
throws可省略一般不写
4、定义通知的实现
Spring AOP项目例子链接。
六、Spring AOP 的实现原理
Spring AOP 是构建在动态代理的基础上因此Spring 对 AOP 的支持局限于方法级别的拦截。
静态代理编码阶段即程序运行之前就确定的代理。 动态代理程序运行时产生的代理。
Spring AOP 支持 JDK Proxy 和 CGLIB 方式实现动态代理。
默认情况下实现了接口的类使用 AOP 会基于JDK 生成代理类没有实现接口的类会基于 CGLIB 生成代理类。
织入代理的生成时机 什么阶段下生成的代理对象叫做织入。有编译器、类加载期、运行期Spring AOP。
6.1、JDK 和 CGLIB 的区别
1、JDK实现要求被代理类必须实现接口之后是通过 InvocationHandler 及 Proxy 在运行时动态的在内存中生成了代理类对象该代理对象是通过实现同样的接口实现(类似静态代理接口实现的方式)只是该代理类是在运行期时动态的织入统一的业务逻辑字节码来完成。 2、 CGLIB实现被代理类可以不实现接口是通过继承被代理类在运行时动态的生成代理类对象。