Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现

简介: 这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。

1、基本概念

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

比如说、你完成了一个功能需求、后来产品经理在这个需求上增加一些新需求。你要么修改源代码(这个可能比较麻烦、耦合性也高)、这个时候就可以使用AOP切面编程、对原有的需求进行功能增强。横切进去、就可以在不修改原先代码的基础上、完成新的需求(也方便后期维护、万一产品经理说、这样又不好呢。修改起来也容易、直接将切面拿走。)

  • (3)使用登录例子说明 AOP
    在这里插入图片描述

2、底层原理

AOP 底层使用动态代理

有两种情况动态代理

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

在这里插入图片描述

  • 第二种 没有接口情况,使用 CGLIB 动态代理
    创建子类的代理对象,增强类的方法
    在这里插入图片描述

3、JDK动态代理实现

3.1 查看对应Proxy方法使用

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

开胃小知识
在这里插入图片描述
在这里插入图片描述

3.2 方法详解

(1)调用 newProxyInstance 方法
在这里插入图片描述
方法有三个参数:
第一参数,类加载器
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口
第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分

3.3 JDK动态代理代码

3.3.1 创建接口,定义方法

PersonDao .java

/**
 * @author Lenovo
 * @version 1.0
 * @data 2022/10/19 22:37
 */
public interface PersonDao {
    public int add(int a,int b);

    public void update(int a);
}

3.3.2 创建接口实现类,实现方法

PersonDaoImpl.java

/**
 * @author Lenovo
 * @version 1.0
 * @data 2022/10/19 22:39
 */
public class PersonDaoImpl implements PersonDao {
    @Override
    public int add(int a, int b) {
        System.out.println("执行了add方法");
        return a+b;
    }

    @Override
    public void update(int a) {
        System.out.println(a);
    }
}

3.3.3 使用 Proxy 类创建接口代理对象

/**
 * @author Lenovo
 * @version 1.0
 * @data 2022/10/19 22:40
 */
public class JdkProxy {
    public static void main(String[] args) {
        //创建接口实现类代理对象
        Class[] interfaces = {PersonDao.class};
//        Proxy.newProxyInstance(JdkProxy.class.getClassLoader(), interfaces,
//                new InvocationHandler() {
//                    @Override
//                    public Object invoke(Object proxy, Method method, Object[] args)
//                            throws
//                            Throwable {
//                        return null;
//                    }
//                });
        PersonDaoImpl personDao = new PersonDaoImpl();
        PersonDao dao = (PersonDao) Proxy.newProxyInstance(JdkProxy.class.getClassLoader(), interfaces, new PersonDaoProxy(personDao));
        int rs = dao.add(4, 5);
        System.out.println("result:" + rs);

    }
}

/**
 * 代理对象代码
 */
class PersonDaoProxy implements InvocationHandler {
    /**
     * 1 把创建的是谁的代理对象,把谁传递过来
     *  有参数构造传递
     */
    private Object obj;

    public PersonDaoProxy(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 rs = method.invoke(obj, args);
        //方法之后
        System.out.println("方法执行之后:" + obj);
        return rs;
    }
}

在这里插入图片描述

3.3.4 测试结果

在这里插入图片描述

4、后语

学无止境…

相关文章
|
3天前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
8 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
13天前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
28 2
|
21天前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
74 9
|
12天前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
31 0
|
5月前
|
安全 Java Spring
Spring之Aop的底层原理
Spring之Aop的底层原理
|
5月前
|
监控 Java Spring
Spring AOP的作用和底层原理、AOP相关术语
Spring AOP的作用和底层原理、AOP相关术语
82 0
|
5月前
|
设计模式 Java uml
Spring AOP 原理
Spring AOP 原理
34 0
|
Java Spring 容器
【Spring AOP底层实现原理】
【Spring AOP底层实现原理】
139 0
|
4月前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
45 0
|
5月前
|
设计模式 监控 Java
【Spring】Spring AOP原理
【Spring】Spring AOP原理