【SSM框架解析】——前篇:详解动态代理【案例驱动】(案例源码自取)

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 今天开始要学习SSM框架了,新的开始我决定用博客来记录自己的学习过程,和CSDN上的大佬们一同进步。

✨前言


今天开始要学习SSM框架了,新的开始我决定用博客来记录自己的学习过程,和CSDN上的大佬们一同进步。

本学习是跟着B站动力节点学习,链接附上

在学习SSM框架之前,首先要先了解代理、静态代理、动态代理,那么这篇文章就先来详解动态代理


文章目录


一、代理模式


客户端无法访问目标对象,通过代理对象进行访问,而且增强式访问。

优点:适合进行业务的扩展

举个例子:假如你是学校负责人,现在要举行一个明星演唱会,你需要请明星来学校进行演唱。但是你能直接练习到明星本人吗?不能,只能通过明星经纪人来联系。

那么这里的明星就是目标对象,经纪人就是代理对象。

再想一下,明星那么大的腕,肯定只进行唱歌,即进行主要业务,那么商量时间,地点,费用等等杂事,即业务的扩展

下图以刘德华举例:


二、代理模式的作用


1)控制目标对象的访问:对于目标对象不是想访问就能访问的,只能通过代理才能进行访问,这样一来目标对象只需要专注主要业务的实现,而不用关心其他事情。

2)增强功能:代理通过自身调创建目标对象,调用目标对象的主业务方法进行实现主业务,那么在调用的前后都可以增加自己的功能,即增强了功能


三、代理模式的分类


1)静态代理

2)动态代理,又为JDK动态代理,CGLib动态代理(子类代理)


四、什么是静态代理


他是代理模式的一种。

它具备一下特点:

  1. 目标对象和代理对象实现同一个业务接口
  2. 目标对象必须实现接口
  3. 代理对象在程序运行前就已经存在
  4. 能够灵活的进行目标对象的切换,却无法进行功能的灵活处理(使用动态代理处理此问题)


五、静态代理实现


案例分析:

业务功能:请明星进行节目表演.

明星刘德华:目标对象(无法直接访问)

刘德华助理:代理对象(我们可以访问,他还可以跟明星对接)

我们 :客户端对象


 代码实现
  业务接口Service
  public interface Service {
    //规定的唱歌的业务功能
    void sing();
  }
  目标对象:
  /**
   *   目标对象:刘德华,实现业务接口中的功能,进行唱歌表演
   */
  public class SuperStarLiu implements Service {
      @Override
      public void sing() {
          System.out.println("我是刘德华,我正在表演唱歌............");
      }
  }
  代理对象:
      public class Agent implements Service {
    //类中的成员变量设计为接口
    public Service target;  //目标对象
    //传入目标对象,方法的参数设计为接口
    public Agent(Service target){
        this.target = target;
    }
    @Override
    public void sing() {
        System.out.println("预订时间..........");
        System.out.println("预订场地..........");
        //切记切记:业务功能必须由目标对象亲自实现
//        SuperStarLiu liu = new SuperStarLiu();
//        liu.sing();
//
//        SuperStarZhou zhou = new SuperStarZhou();
//        zhou.sing();
        //面向接口编程:调用时,接口指向实现类
        target.sing();
        System.out.println("结算费用..........");
    }
}
  客户端对象
   @Test
    public void testAgent(){
    //测试功能
  //        SuperStarLiu liu = new SuperStarLiu();
  //        liu.sing();
  //        Agent agent = new Agent();
  //        agent.sing();
          //有接口和实现类,必须使用接口指向实现类(规范)
          Service agent = new Agent();
          agent.sing();
      }

六、面向接口编程(重要)


  • 类中的成员变量设计为接口
//类中的成员变量设计为接口
    public Service target;  //目标对象
  • 方法的形参设计为接口
//传入目标对象,方法的参数设计为接口
    public Agent(Service target){
        this.target = target;
    }
  • 方法的返回值设计为接口
    本例子暂时还未涉及,后面文章将涉及到。
  • 调用时接口指向实现类
//有接口和实现类,必须使用接口指向实现类(规范)
          Service agent = new Agent();

七、动态代理


可以看出,静态代理有个问题,如果我们需要扩展主要功能,即添加Service接口中的业务,那么我们同时需要在目标对象和代理对象的类中实现该方法。

例子,如果我们想看刘德华跳舞,(他也带愿意,假设愿意…),那么首先刘德华要愿意,实现跳舞,同时也要告诉经纪人刘德华可以跳舞才可以,这样一来我们就需要改动已经写好的源码,比较麻烦。这时动态代理就比较好的解决了这个问题。

代理对象在程序运行的过程中动态在内存构建.可以灵活的进行业务功能的切换.


八、JDK动态代理要求(严格执行)


  1. 目标对象必须实现业务接口
  2. JDK代理对象不需要实现业务接口
  3. JDK动态代理的对象在程序运行前不存在.在程序运行时动态的在内存中构建
  4. JDK动态代理灵活的进行业务功能的切换
  5. 本类中的方法(非接口中的方法)不能被代理


九、JDK动态代理用到的类和接口


它是使用现在的工具类完成JDK动态实现.

1)Proxy类

它是java.lang.reflect.Proxy包下的类. 它有一个方法Proxy.newProxyInstance(…)专门用来生成动态代理对象.

public static Object newProxyInstance(ClassLoader loader,  //类加载器
                                        Class<?>[] interfaces,//目标对象实现的所有接口
                                       InvocationHandler h //它就类似于Agent的功能,代理的功能和目标对象的业务功能调用在这
                                          )
        throws IllegalArgumentException
    {...}

2)Method类

反射用的类,用来进行目标对象的方法的反射调用.
method对象接住我们正在调用的方法sing(),show()

 method==sing(),show()
  method.invoke();==>手工调用目标方法  sing();   show();

** 3)InvocationHandler接口 **

它是实现代理和业务功能的.我们在调用时使用匿名内部实现.

 代码实现:
  public class ProxyFactory {
    //类中的成员变量设计为接口,目标对象
    Service target;
    //传入目标对象
    public ProxyFactory(Service target){
        this.target = target;
    }
    //返回动态代理对象
    public Object getAgent(){
        return Proxy.newProxyInstance(
                //ClassLoader loader, 类加载器,完成目标对象的加载
                target.getClass().getClassLoader(),
                //Class<?>[] interfaces,目标对象实现的所有接口
                target.getClass().getInterfaces(),
                //InvocationHandler h,实现代理功能的接口 ,我们传入的是匿名内部实现
                new InvocationHandler() {
                    @Override
                    public Object invoke(
                            //创建代理对象
                            Object proxy,
                            //method就是目标方法sing(),show()
                            Method method,
                            //目标方法的参数
                            Object[] args) throws Throwable {
                        //代理功能
                        System.out.println("预订时间........");
                        //代理功能
                        System.out.println("预订场地........");
                        //主业务功能实现
                        //target.sing();还是写死了方法的调用, 不成
                        //sing(),show(),one()
                        Object obj = method.invoke(target,args);
                        //代理功能
                        System.out.println("结算费用........");
                        return obj;  //切记:这个是目标方法的返回值
                    }
                }
        );
    }
}

十、CGLib动态代理


CGLib又称为子类.通过动态的在内存中构建子类对象,

重写父类的方法进行代理功能的增强.

如果目标对象没有实现接口,则只能通过CGLib子类代理来进行功能增强.

子类代理是对象字节码框架ASM来实现的.

注意:

被代理的类不能为final, 否则报错.

目标对象的方法如果为final/static, 那么就不会被拦截,即不会执行目标对象额外的业务方法。


  public Object getProxyInstance(){   
    //1.使用工具类
    Enhancer en=new Enhancer();
    //2.设置父类
    en.setSuperclass(target.getClass());
    //3.设置回调函数
    en.setCallback(this);
    //4.创建子类(代理)对象
    return en.create();  ===>返回的是子类代理对象

✨总结


动态代理可以很方便的控制访问,功能增强,扩展功能,同时mybatis框架底层也是实现动态代理实现的,学习了动态代理可以更好的理解mybatis的底层实现原理。

下一篇文章将详解mybatis框架

本案例的源码将放在gitee上,点击进入。如果有帮助请点亮星星。

有收获的小伙伴三连一下吧,你们的喜欢是我更新的最大动力。


相关文章
|
9月前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
535 27
|
9月前
|
Java 关系型数据库 MySQL
weixin050高校体育场管理系统+ssm(文档+源码)_kaic
本文针对高校体育场管理系统的开发与实现进行详细介绍。随着经济快速发展,人们对手机软件需求增加,高校体育场管理系统应运而生。系统采用JAVA技术、Mysql数据库和SSM框架等成熟技术,通过分析功能需求、可行性及性能,设计出包含管理员、用户和学生角色的功能模块。系统实现用户注册登录、信息管理等功能,简化传统手工统计模式,提高管理效率,满足用户对信息获取的及时性与准确性需求。
weixin050高校体育场管理系统+ssm(文档+源码)_kaic
|
9月前
|
小程序 JavaScript 关系型数据库
weixin118电影院订票选座系统设计及实现+ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的电影院订票选座系统。该系统采用WXML、WXS、JS小程序语言开发,结合微信开发者工具和MYSQL数据库,实现了便捷的订票选座功能。用户无需下载安装,通过微信即可快速访问,操作简单高效。系统分为用户与管理员两大模块,支持电影信息查询、在线选座、订单管理等功能,同时确保数据安全与用户体验。经过可行性分析、功能设计、测试等环节,系统表现出良好的稳定性、实用性和可扩展性,为用户提供了一个全面、便捷的订票平台。
|
8月前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
9月前
|
小程序 Java 关系型数据库
weixin116大学生就业平台微信小程序+ssm(文档+源码)_kaic
本文介绍了一款大学生就业平台微信小程序的开发过程,涵盖开发环境、系统设计、实现与测试等方面。该小程序基于微信平台特性,采用MYSQL数据库存储数据,确保系统稳定与安全,同时满足学生、企业和管理员不同权限用户的功能需求。通过简化操作流程,实现了招聘信息查看、简历投递等实用功能,旨在为用户提供便捷高效的求职体验,符合“操作简单,功能实用”的设计理念。
|
8月前
|
小程序 关系型数据库 Java
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
|
9月前
|
小程序 Java 关系型数据库
weixin049校园外卖平台设计与实现+ssm(文档+源码)_kaic
本文介绍了一款校园外卖平台的设计与实现过程。该平台采用Java的SSM框架进行后台管理开发,使用MySQL作为本地数据库,并通过微信小程序为用户提供便捷的操作界面。系统包括管理员、用户和商家三个角色,功能涵盖个人中心、用户及商家管理、菜品分类与信息管理、订单处理等。管理员可在浏览器上登录管理后台数据,用户与商家则通过微信小程序注册登录,分别实现订餐与菜品管理功能。此平台具备界面清晰、操作简单、功能齐全的特点,有助于提升校园外卖管理的效率与规范性。
|
9月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
532 3
|
9月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
351 4
|
9月前
|
机器学习/深度学习 人工智能 搜索推荐
技术革新下的培训新趋势:案例解析
从最初的“试试看”,到如今的“非做不可”,企业培训已经成为央国企和上市公司不可或缺的战略环节。无论是AI与大模型的赋能,DeepSeek,还是具身智能、智算技术和数据科学的实战应用,这些课程都在为企业打开新的可能性。

推荐镜像

更多
  • DNS