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、后语

学无止境…

相关文章
|
2月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
70 5
|
2月前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
2月前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
49 5
|
2月前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
49 4
|
4月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
396 3
|
12天前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
123 7
|
5月前
|
Oracle Java 关系型数据库
Mac安装JDK1.8
Mac安装JDK1.8
800 4
|
5月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
67 1
|
2月前
|
Oracle Java 关系型数据库
安装 JDK 时应该注意哪些问题
选择合适的JDK版本需考虑项目需求与兼容性,推荐使用LTS版本如JDK 17或21。安装时注意操作系统适配,配置环境变量PATH和JAVA_HOME,确保合法使用许可证,并进行安装后测试以验证JDK功能正常。
63 1
|
2月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
85 1