广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring AOP底层原理及代理模式
  • 667
分享到

Spring AOP底层原理及代理模式

2024-04-02 19:04:59 667人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录spring aop底层原理代理模式一、什么是 AOP二、AOP 底层原理1. 什么是代理?2. 什么是静态代理3. 什么是动态代理Spring AOP底层原理代理模式 一、什么

Spring AOP底层原理代理模式

一、什么是 AOP

AOP 就是面向切面编程,是 OOP(面向对象编程)的延续。

利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序可用性,同时也提高了开发效率。

通俗一点说,不用修改原代码,可以给原代码增加新的功能。

二、AOP 底层原理

AOP 底层原理是使用动态代理。

那代理是什么?有动态代理,那是不是还有静态代理?

1. 什么是代理?

就是为一个目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。使用代理对象,是为了在不修改目标对象的基础上,增强目标对象的业务逻辑。

比如目标对象 A,代理对象是 B。

  • 那么现在 B 对 A 进行引用,可以实现 A 有的功能。
  • 另外,B 还可以在自身进行一些新功能,最终不需要修改目标对象 A 。

而代理分为静态代理和动态代理,区别是:

静态代理有真实的代理类存在,就是我们会代码中创建一个代理类,并在代理类的方法中调用目标对象的方法,以此来完成代理的工作。动态代理的代理类没有在代码中创建一个代理类,而是在运行时在JVM里面创建代理对象。

2. 什么是静态代理

静态代理是有实实在在的代理类存在,并且和目标类实现相同的接口。

比如,有一个转账业务,现在希望给它增加功能,使在转账之前确认转账人身份,以及转账之后通知收款人。

(1) 接口 AccountServiceDao :

package com.pingguo.spring5.dao;
public interface AccountServiceDao {
    // 主业务逻辑,转账
    void transfer();
}

(2) 接口 AccountServiceDao 的实现类:

package com.pingguo.spring5.dao;
public class AccountServiceImpl implements AccountServiceDao {
    @Override
    public void transfer() {
        System.out.println("调用dao层,完成转账主业务.");
    }
}

(3) 代理类 AccountProxy :

package com.pingguo.spring5.proxy;
import com.pingguo.spring5.dao.AccountServiceDao;
public class AccountProxy implements AccountServiceDao {
    // 目标对象
    private AccountServiceDao target;
    public AccountProxy(AccountServiceDao target) {
        this.target = target;
    }
    
    @Override
    public void transfer() {
        before();
        target.transfer();
        after();
    }
    
    private void before() {
        System.out.println("对转账人身份进行验证.");
    }
    
    private void after() {
        System.out.println("转账完成,已通知收款人.");
    }
}

在代理类中:

  • 添加了添加了目标对象,并且有参构造方法里需要传入目标对象。
  • 代理方法里,调用了目标对象里的转账方法 target.transfer()。
  • before() 和 after() 则是 2个增强的方法,分别作用于 target.transfer() 的前面和后面。

(4) 运行测试新建一个测试方法,运行看下结果:

@Test
    public void testProxy() {
        // 创建目标对象
        AccountServiceDao target = new AccountServiceImpl();
        // 创建代理对象
        AccountProxy proxy = new AccountProxy(target);
        proxy.transfer();
    }
  • 这里先创建了目标对象
  • 再创建代理对象,并且把目标对象传入
  • 最后调用代理对象里的,被增强过的方法 transfer()。

结果:

对转账人身份进行验证.
调用dao层,完成转账主业务.
转账完成,已通知收款人.
Process finished with exit code 0

优点:

  • 效率高,因为所有的类都是已经编写完成的,使用的时候只需要取得代理对象并且执行即可。
  • 同时也可以实现对目标对象中指定的方法进行增强。

缺点:

  • 与目标类实现相同的接口代码,冗余。
  • 如果接口发生改变,代理类中的方法也要修改。
  • 代理类服务于一种类型的对象,如果要服务多类型的对象,那么要为每种类型的对象都生成代理类。

3. 什么是动态代理

与静态代理的硬编码方式相比,动态代理支持运行时动态生成代理对象这种方式。换句话说,动态代理并不存在代理类,代理对象直接由代理生成工具动态生成。

优点:

  • 用很少的代码对一个类的所有方法实现一样的增强效果。
  • 在编码时,代理逻辑与业务逻辑互相独立,各不影响,减少侵入,降低耦合。

缺点:

相对于静态代理,它不能增强其中的某一个方法。

对于动态代理,针对于是否存在接口的情况下,又分为 2 种:

  • 有接口的情况下,使用 jdk 动态代理。
  • 无接口的情况下,使用 CGLIB 动态代理。

使用 JDK 动态代理

使用 JDK 动态代理,创建的是接口实现类的代理对象,以此来实现功能增强。

现在不需要上面创建过的实际代理类了 。

接口,为了后面的一些知识点的说明,里面加个参数,转账的金额:

package com.pingguo.spring5.dao;
public interface AccountServiceDao {
    // 主业务逻辑,转账
    void transfer(int amount);
}

实现类:

package com.pingguo.spring5.dao;
public class AccountServiceImpl implements AccountServiceDao {
    @Override
    public void transfer(int amount) {
        System.out.println("调用dao层,完成转账主业务.金额:" + amount);
    }
}

在测试方法里,直接使用动态代理:

@Test
    public void testDynamicProxy() {
        // 创建目标对象
        AccountServiceDao target = new AccountServiceImpl();
        // 创建代理对象
        AccountServiceDao proxy = (AccountServiceDao) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),  // 目标类使用的类加载器
                target.getClass().getInterfaces(),  // 目标类实现的接口
                new InvocationHandler() {  // 调用处理器
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("对转账人身份进行验证.");
                        Object res =  method.invoke(target, args);
                        System.out.println("转账完成,已通知收款人.");
                        return res;
                    }
                }
        );
        // 让代理工作
        proxy.transfer(10000);
    }

运行结果:

对转账人身份进行验证.
调用dao层,完成转账主业务.金额:10000
转账完成,已通知收款人.
Process finished with exit code 0

动态代理的过程:

  • 创建处理器 InvocationHandler实例。
  • 在调用目标对象时,会调用代理对象。
  • 代理对象去请求目标对象。invoke 方法就是调用目标对象的方法生成代理对象的过程。
  • 同时,在 invoke 方法中进行功能增强。

对于 invoke 中的 3 个参数,分别是:

  • Object proxy:代理对象,一般不会使用。
  • Method method:外面的代理对象调用的方法引用,这里引用的就是 transfer()
  • Object[] args:外面的代理对象调用的方法里面的参数,这里就是参数 amount。

使用 CGLIB 动态代理

CGLIB动态代理的原理是生成目标类的子类,这个子类对象就是代理对象,代理对象是被增强过的。

注意,不管有没有接口都可以使用 CGLIB 动态代理, 而不是只有在无接口的情况下才能使用。

示例就暂时不放了,因为我本地环境问题,有个报错始终未解决,后续再说,不影响继续学习 spring。

以上就是Spring AOP底层原理及代理模式的详细内容,更多关于Spring AOP底层原理的资料请关注编程网其它相关文章!

--结束END--

本文标题: Spring AOP底层原理及代理模式

本文链接: https://www.lsjlt.com/news/150149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring AOP底层原理及代理模式
    目录Spring AOP底层原理代理模式一、什么是 AOP二、AOP 底层原理1. 什么是代理?2. 什么是静态代理3. 什么是动态代理Spring AOP底层原理代理模式 一、什么...
    99+
    2022-11-13
  • Spring AOP底层原理及代理模式实例分析
    这篇文章主要介绍“Spring AOP底层原理及代理模式实例分析”,在日常操作中,相信很多人在Spring AOP底层原理及代理模式实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”S...
    99+
    2023-06-30
  • Spring AOP底层机制之代理模式
    目录代理模式静态代理静态代理再理解动态代理深化理解动态代理的好处代理模式 为什么要学习代理模式,因为AOP的底层机制就是动态代理! 代理模式: 静态代理动态代理 学习aop之前 , ...
    99+
    2022-11-13
    Spring 代理模式 Spring AOP底层机制
  • spring aop底层原理及如何实现
    目录前言 使用 源码分析 总结 前言 相信每天工作都要用spring框架的大家一定使用过spring aop,aop的概念是面向切面编程,相对与传统的面向对象编程oop,aop更关...
    99+
    2022-11-12
  • spring aop底层原理及实现方法
    这篇文章主要介绍spring aop底层原理及实现方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用要分析spring aop的底层原理,首先要会使用,先创建一个普通maven webapp项目,引入spring...
    99+
    2023-06-14
  • Spring AOP原理及动态代理
    目录一、什么是代理1、静态代理2、动态代理二、模拟Spring AOP场景一、什么是代理 指为一个目标对象提供一个代理对象, 并由代理对象控制对目标对象的引用. 使用代理对象, 是为...
    99+
    2022-11-13
  • Spring底层原理是什么
    这篇文章主要讲解了“Spring底层原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring底层原理是什么”吧!Spring简介ClassPathXmlApplicationCo...
    99+
    2023-07-05
  • Spring Cloud的底层架构原理
    本篇内容主要讲解“Spring Cloud的底层架构原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud的底层架构原理”吧!Eureka首先,我们得说说服务注册中心 Eur...
    99+
    2023-06-19
  • Spring底层原理深入分析
    目录bean生命周期推断构造方法的底层原理1、使用哪个构造方法2、如果有参把哪个bean对象赋值给入参AOP实现原理spring事务@Configuration循环依赖为什么会出现循...
    99+
    2022-11-13
  • Spring底层事务原理解析
    目录一、@EnableTransactionManagement工作原理二、Spring事务基本执行原理四、Spring事务传播机制五、Spring事务传播机制分类六、Spring事...
    99+
    2022-12-10
    Spring底层事务原理 Spring底层事务 Spring底层原理
  • SpringAOP的底层实现方式-代理模式
    目录1.1 静态代理1.2 动态代理1.2.1 JDK动态代理(必须有接口)1.2.2 CGlib动态代理在学习Spring的过程中,留下一下痕迹。 代理模式,其实就是让别人做同样的...
    99+
    2022-11-12
  • spring声明式事务@Transactional底层工作原理
    目录引言工作机制简述事务AOP核心类释义@TransactionalTransactionAttributeSpringTransactionAnnotationParserAnno...
    99+
    2022-11-13
  • Spring中AOP概念与两种动态代理模式原理详解
    目录1.概念1.AOP技术简介2.AOP的优势3.Spring AOP术语4.AOP 开发明确的事项 2.AOP底层实现1.AOP 的动态代理技术:3.基于cglib的动态...
    99+
    2022-11-12
  • Spring Boot底层原理实例分析
    这篇“Spring Boot底层原理实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
    99+
    2023-06-29
  • 深度剖析Spring Cloud底层原理
    毫无疑问,Spring Cloud 是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对 Spring Cloud 功能使用的层面,其底层的很多原理,很多人可能并不知晓。实际上,Spring Cloud 是一...
    99+
    2023-06-05
  • Spring Boot的底层原理是什么
    这篇文章主要讲解了“Spring Boot的底层原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot的底层原理是什么”吧!1.基于你对springboot的理解描述...
    99+
    2023-06-27
  • Vue模拟响应式原理底层代码实现的示例
    目录1.Vue.js功能:2.Observer.js功能(数据劫持):3.Compiler.js功能:4.Dep.js功能:5.Watcher.js功能:整体分析Vue的基本结构如下...
    99+
    2022-11-12
  • Spring boot整合tomcat底层原理剖析
    目录本文结论spring-boot-starter-web内部有什么?TomcatServletWebServerFactory的作用:获取WebServer对象spring boo...
    99+
    2022-11-13
    Spring boot整合tomcat Spring boot 整合tomcat原理
  • Spring底层原理由浅入深探究
    目录Spring简介Spring中是如何创建一个对象Bean的创建过程推断构造方法AOP大致流程Spring事务Spring简介 ClassPathXmlApplicationCon...
    99+
    2023-02-24
    Spring底层原理 Spring核心原理 Spring底层核心
  • 深入探究Spring底层核心原理
    目录Spring底层核心原理Bean的生命周期推断构造方法AOP原理Spring事务Spring底层核心原理 下面这几行代码是一个Spring的入门代码,第一行是通过java配置类 ...
    99+
    2023-05-16
    Spring底层核心原理 Spring底层原理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作