IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring5 中的 AOP -> 正文阅读

[Java知识库]Spring5 中的 AOP

Spring5 中的 AOP

一,AOP 概念
1,什么是 AOP
(1)面向切面编程(面向方面编程),对业务逻辑层的各个部分进行隔离,从而使的业务层各个部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)不修改源代码,而是在主干功能里面添加新功能
(3)只能在判断模块添加新的功能
二,底层原理
1,AOP 底层使用动态代理
(1)有两种情况动态代理

  • 第一种,有接口情况,使用 JDK 动态代理
    创建接口实现类代理对象,增强类的方法
  • 第二种,没有接口情况,使用 CGLIB 动态代理
    创建当前类子类的代理对象,增强类的方法
    三,JDK动态代理
    1,使用JDK动态代理,使用Proxy类里面的方法创建代理对象
    (1)调用newProxyInstance方法
    有三个参数:
  • 第一个:类加载器;
  • 第二个:增强方法所在的类,这个类实现的接口,支持多个接口;
  • 第三个:实现这个接口InvocationHandler,创建代理对象,写增强的方法
    2,编写JDK动态代理代码
    (1)创建接口,定义方法
public interface UserDao {
    
    public int add(int a, int b);

    public String updata(String id);
}

(2)创建接口实现类,实现方法

public class UserDaoImpl implements UserDao {
    @Override
    public int add(int a, int b) {
        System.out.println("add方法执行了....");
        return a + b;
    }

    @Override
    public String updata(String id) {
        System.out.println("updata方法执行了....");
        return id;
    }
}

(3)使用Proxy类创建接口代理对象

public class JDKProxy {
    public static void main(String[] args) {
        //创建接口实现类代理对象
        Class[] interfaces = {UserDao.class};
//        方法1:匿名内部类
//        Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
//            //new InvocationHandler()匿名内部类
//            @Override
//            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                return null;
//            }
//        });

        //方法2:
        UserDaoImpl userDao = new UserDaoImpl();
        //下面这一行类似于UserDao dao = new UserDaoImpl();
        UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
        int result = dao.add(1, 2);
        System.out.println("result:" + result);
    }
}

//创建代理对象代码
class UserDaoProxy implements InvocationHandler {

    //1,把创建的是谁的代理对象,把谁传递过来
    //有参数构造传递
    private Object obj;

    //也可以传UserDaoImpl
    public UserDaoProxy(Object obj) {
        this.obj = obj;
    }

    //增强的逻辑
    @Override
    public 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);

        return res;
    }
}

4,打印结果

方法之前执行…add:传递的参数…[1, 2]
add方法执行了…
方法之后执行…com.at.spring5.UserDaoImpl@78308db1
result:3

四,AOP术语
1,连接点
类中哪些方法 可以被增强 ,这些可以被增强的方法称为连接点。
2,切入点
实际被增强 的方法,被称为切入点
3,通知(增强)
(1)实践增强的逻辑部分,称之为通知(增强);
(2)通知有多种类型:

  • 前置通知
  • 后置通知
  • 环绕通知
  • 异常通知
  • 最终通知 (类似于finally)

4,切面
是动作:

  • 把通知应用到切入点的过程
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-27 10:57:09  更:2022-02-27 10:58:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:33:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码