五、AOP(1)

news/2024/11/13 4:24:27/

一、AOP基本概念

1.什么是AOP

  • 面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
  • 不通过修改源代码方式添加新的功能
  • 通过画图理解AOP

 二、AOP(底层原理)

1.AOP底层使用动态代理

有两种情况的动态代理

  • 第一种 有接口的情况,使用JDK动态代理
  • 创建接口实现类的代理对象,增强类的方法
  • 第二种 没有接口的情况,使用CGLIB动态代理
  • 创建子类的代理对象,增强类的方法

 三、AOP(JDK动态代理)

1.使用JDK动态代理,使用Proxy类里面的方法创建代理对象

  • 调用newProxyInstance方法
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

①参数一ClassLoader类加载器

②参数二Class<?>[] 增强方法所在的类,这个类实现的接口,支持多个接口

③参数三InvocationHandler实现这个接口,创建代理对象,实现增强的方法。

2.JDK动态代理代码

  • 创建接口,定义方法
public interface UseDao {public int add(int a,int b);public String update(String id);
}
  • 创建接口的实现类,实现接口的方法
public class UserDaoImpl implements UseDao {@Overridepublic int add(int a, int b) {return a + b;}@Overridepublic String update(String id) {return id;}
}
  • 使用Proxy类创建接口代理对象

①写InvocationHandler的实现类

class UserDaoProxy implements InvocationHandler{//1.把创建的是谁的代理对象,需要传过来。//有参构造private Object obj;public UserDaoProxy(Object obj){this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法之前System.out.println("方法之前执行...."+method.getName()+":传递的参数..."+ Arrays.toString(args));//被增强的方法执行Object res = method.invoke(obj, args);//方法之后System.out.println("方法之后执行...."+obj.toString());return res;}
}

②写创建接口实现类的代理对象

public static void main(String[] args) {//创建接口实现类的代理对象Class[] interfaces = {UseDao.class};UseDao dao = (UseDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(new UserDaoImpl()));// 当代理对象调用真实对象的方法时,自动跳转到代理对象关联handler的invoke方法调用int result = dao.add(1, 2);String ddd = dao.update("ddd");
}

结果是

 四、AOP(术语)

1.连接点

类里面哪些方法可以被增强,这些方法成为连接点。如:add(),update()…

2.切入点

实际被真正增强的方法,成为切入点。如只增强“add()”方法

3.通知(增强)

  • 实际增强的逻辑部分成为通知
  • 通知有多种类型:如add方法

        *前置通知:add方法之前执行

        *后置通知:add方法之后执行

        *环绕通知:在add方法的前面和后面都执行

        *异常通知:当add方法出现异常执行

        *最终通知:finally

4.切面

是动作

  • 把通知应用到切入点的过程

五、AOP操作(准备)

1.Spring框架一般基于AspectJ实现AOP操作

  • 什么是AspectJ

*AspectJ不是Spring组成部分,独立AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作

2.基于AspectJ实现AOP操作

  • 基于xml配置文件实现
  • 基于注解方式实现(使用)

3.在项目工程里面引入AOP相关依赖

4.切入点表达式

  • 切入点表达式作用:知道对哪个类里面的哪个方法进行增强
  • 语法结构

execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表]))

举例1:对com.zhilei.dao.BookDao类里面的add进行增强

execution(*com.dao.BookDao.add(..))修饰符可以省略,返回类型用*,代表参数..

举例2:对com.zhilei.dao.BookDao类里面的所有方法进行增强

execution(*com.dao.BookDao.*(..)

举例3:对com.zhilei.dao包里的所有类,所有方法,进行增强

execution(*com.dao.*.*(..)

 

 


http://www.ppmy.cn/news/85114.html

相关文章

CVE-2018-2894WebLogic未授权任意文件上传

CVE-2018-2894WebLogic未授权任意文件上传 这个洞的限制就比较多了 限制版本 Oracle WebLogic Server版本 10.3.6.0 12.1.3.0 12.2.1.2 12.2.1.3 限制配置 该漏洞的影响模块为web服务测试页&#xff0c;在默认情况下不启用。 /ws_utc/config.do /ws_utc/begin.do 默认情况下不…

UnityVR--组件3--Line Renderer--线性渲染

目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1&#xff1a;使用Line Renderer绘制线段 应用1实现&#xff1a;使用系统工具或自定义工具绘制线段 应用2&#xff1a;Trail Renderer简单制作子弹拖尾效果 应用3&#xff1a;…

day12 - 图像修复

在图像处理的过程中&#xff0c;经常会遇到图像存在多余的线条或者噪声的情况&#xff0c;对于这种情况我们会先对图像进行预处理&#xff0c;去除掉对图形内容有影响的噪声&#xff0c;在进行后续的处理。 本节实验我们介绍使用图像膨胀来处理图形的多余线条&#xff0c;进行…

软件测试完后,运行后还有BUG,测试人员就应该背锅吗?

测试完成后还有bug&#xff0c;测试人员肯定是有责任的&#xff0c;第一时间要赶紧处理而不是着急甩锅。但是这口锅全部扣测试身上&#xff0c;明显也是不能接受的&#xff0c;关键在于测试人员需要找出足够的证据来保护自己。 或许很多人会说测试不可能发现所有的bug&#xf…

从索引结点出发探索软、硬链接

索引结点的初步认识 对于整个计算机系统的资源管理&#xff0c;我们可以认为&#xff0c;OS先将这些资源的数据信息&#xff0c;给描述起来构成一个部分&#xff0c;然后再将它们组织起来&#xff0c;就能够实现由OS集中管理。举一个最经典的例子&#xff0c;进程的引入是为了…

算法Day16 | 104.二叉树的最大深度,559.n叉树的最大深度, 111.二叉树的最小深度,222.完全二叉树的节点个数

Day16 104.二叉树的最大深度559.n叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 104.二叉树的最大深度 题目链接&#xff1a; 104.二叉树的最大深度 深度和高度相反。 高度&#xff0c;自然是从下向上数&#xff1a;叶子节点是第一层&#xff0c;往上数&#x…

【C语言】常用内置函数汇总

printf()&#xff1a;输出函数&#xff0c;用于在屏幕上显示文本或变量的值。 scanf()&#xff1a;输入函数&#xff0c;用于从键盘上获取用户输入的数据。 strlen()&#xff1a;字符串长度函数&#xff0c;用于计算一个字符串的长度。 strcpy()&#xff1a;字符串复制函数&…

AI 生成第7篇测试文章:测试数据需要怎么准备?

背景 测试数据是软件测试过程中至关重要的组成部分。一般来说&#xff0c;测试数据并不是随机生成的数据&#xff0c;而是经过精心设计和构造的数据&#xff0c;以确保软件系统可以完整地进行测试。在本文中&#xff0c;我们将探讨如何准备测试数据。 准备测试数据 1.理解测…