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

学无止境…

相关文章
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
951 0
|
12月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
12月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
898 2
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
1582 0
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
1706 141
|
存储 Ubuntu 安全
在Ubuntu 16.04上安装openjdk-6/7/8-jdk的步骤
在整个安装过程中,你可能需要管理员权限,因此你可能要使用 `sudo` 来获取必要的权限。记得做完每一个步骤后,都要检查输出,以确保没有发生错误,并且每项操作都成功完成。如果在安装过程中遇到问题,查看 `/var/log/` 下的日志文件对于问题的解决可能是有帮助的。
862 21
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
691 41
|
IDE Ubuntu Java
在Ubuntu18.04安装兼容JDK 8的Eclipse集成开发环境的指南。
完成以上步骤后,您将在Ubuntu 18.04系统上成功安装并配置了Eclipse IDE,它将与JDK 8兼容,可以开始进行Java开发工作。如果遇到任何问题,请确保每一步骤都正确执行,并检查是否所有路径都与您的具体情况相匹配。
649 11
|
Oracle Java 关系型数据库
Tomcat和JDK的详细安装、下载和环境配置指南
以上就是JDK和Tomcat的下载、安装和环境配置的详细步骤。希望这个指南能帮助你顺利完成设置。
1023 32