温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
  • 忘记密码?
登录注册×
获取短信验证码
其他方式登录
点击 登录注册 即表示同意 《亿速云用户服务条款》
  • 服务器
  • 数据库
  • 开发技术
  • 网络安全
  • 互联网科技
登 录 注册有礼
最新更新 网站标签 地图导航
产品
  • 首页 > 
  • 教程 > 
  • 开发技术 > 
  • Spring静态代理和动态代理概念及使用方法是什么

Spring静态代理和动态代理概念及使用方法是什么

发布时间:2023-02-27 10:37:34 来源:亿速云 阅读:91 作者:iii 栏目: 开发技术

这篇文章主要讲解了“Spring静态代理和动态代理概念及使用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring静态代理和动态代理概念及使用方法是什么”吧!

代理模式

在学习 AOP 之前,我们先来了解下代理模式, 代理模式分为静态代理以及动态代理,属于23中设计模式之一。 AOP 的底层机制就是动态代理。

Spring静态代理和动态代理概念及使用方法是什么

作用:

通过代理类为原始类增加额外的功能

1、静态代理

1)案例展示

【1】定义一个 Teacher 接口,接口中定义两个方法:teachOnLine 和 teachOffLine。

package cn.gc.spring03.interfce;
public interface Teacher {
    String teachOnLine(String course);
    String teachOffLine(String course);
}

【2】定义一个实现 Teacher 接口的 TeacherA 实现类,代码如下:

package cn.gc.spring03.interfce.impl;
import cn.gc.spring03.interfce.Teacher;
public class TeacherA implements Teacher {
    @Override
    public String teachOnLine(String course) {
        System.out.println("开始"+course+"课程线上教学");
        return course+"课程线上教学";
    }
    @Override
    public String teachOffLine(String course) {
        System.out.println("开始"+course+"课程线下教学");
        return course+"课程线下教学";
    }
}

【3】现在我们要在两个方法中的 开始课程教学 的前后添加上下课铃声的功能,此时我们再定义一个实现 Teacher 接口的静态代理类 TeacherAStaticProxy,代码如下:

package cn.gc.spring03.proxy;
import cn.gc.spring03.interfce.Teacher;
import cn.gc.spring03.interfce.impl.TeacherA;
public class TeacherAStaticProxy implements Teacher {
    TeacherA teacherA=new TeacherA();
    @Override
    public String teachOnLine(String course) {
        System.out.println(course+"课程上课时间到了");
        String s = teacherA.teachOnLine(course);
        System.out.println(course+"课程下课时间到了");
        return s;
    }
    @Override
    public String teachOffLine(String course) {
        System.out.println(course+"课程上课时间到了");
        String s = teacherA.teachOffLine(course);
        System.out.println(course+"课程下课时间到了");
        return s;
    }
}

【4】运行效果如下

Spring静态代理和动态代理概念及使用方法是什么

2)静态代理优缺点

(1)优点 :在不修改目标对象的功能前提下,能通过代理对象对目标功能扩展;可以使得真实角色更加纯粹,不再去关注一些公共的事情;公共的业务由代理来完成,实现了业务的分工。

(2)缺点 :因为代理对象需要与目标对象实现一样的接口,所以会很多代理类 ,一旦接口增加方法,目标对象与代理对象都要维护,工作量变大,开发效率降低。

3)开发代理对象的原则

  • 代理对象和目标对象实现相同的接口

  • 代理对象依赖于目标对象

2、动态代理

在不改变原来的代码的情况下,实现了对原有功能的增强,这是 AOP 中最核心的思想。

AOP:纵向开发,横向开发

Spring静态代理和动态代理概念及使用方法是什么

1)简介

动态代理的角色和静态代理的一样。但是动态代理的代理类是动态生成的,而静态代理的代理类是提前写好的。

动态代理分为两类,一类是基于接口动态代理(JDK),一类是基于类的动态代理(CGLib)。

2)基于接口动态代理(JDK)

程序运行的过程中,通过 JDK 提供代理技术动态的为某个类产生动态代理对象的过程。

开发代理对象的原则:

  • 代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用JDK动态代理。

  • 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象。

  • 动态代理也叫做 :JDK代理、接口代理。

JDK 的动态代理需要了解两个类:

核心 : InvocationHandler (调用处理程序) 和 Proxy (代理)

Spring静态代理和动态代理概念及使用方法是什么

实现步骤:在上面案例的基础上实现。

创建一个基于 JDK 的代理工具类 DynamicProxy 类:

package cn.gc.spring03.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/*
 * 基于JDK的代理工具类
 */
public class DynamicProxy {
    //被代理对象
    private Object target;
    public DynamicProxy(Object obj) {
        this.target = obj;
    }
    //生成代理对象
    public Object getProxy() {
        //获取类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //获取被代理对象实现的所有接口
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //增强功能代码编写的位置
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 增强的功能
                System.out.println(args[0] + "课程上课时间到了");
                // 通过反射执行目标方法
                Object invoke = method.invoke(target, args);
                // 增强的功能
                System.out.println(args[0] + "课程下课时间到了");
                return invoke;
            }
        };
        Object o = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
        return o;
    }
}

测试:

    @Test
    public void test02() {
        Teacher teacher  = new TeacherA();
        DynamicProxy dynamicProxy = new DynamicProxy(teacher);
        Teacher teacherProxy = (Teacher) dynamicProxy.getProxy();
        teacherProxy.teachOnLine("Java");
        System.out.println("______________________");
        teacherProxy.teachOnLine("C++");
    }

运行效果:

Spring静态代理和动态代理概念及使用方法是什么

3)基于类的动态代理(CGLib)

开发代理对象的原则:

  • 代理对象无需和原始类对象实现相同的接口

  • 代理对象和原始类对象要存在父子类关系

CGLib 的动态代理需要了解两个类:

  • 核心 : Enhancer 和 MethodInterceptor

实现步骤

创建一个 Aoo 类:

package cn.gc.spring03.interfce.impl;
public class Aoo {
    public String test01(String info){
        System.out.println("Aoo中的test01方法被调用。");
        return info;
    }
}

创建一个基于 CGLib 的代理工具类 CglibProxy 类:

package cn.gc.spring03.proxy;
import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxy {
    private Object target;
    public CglibProxy(Object obj){
        this.target=obj;
    }
    public Object getProxy(){
        Enhancer enhancer=new Enhancer();
        //设置类加载器
        enhancer.setClassLoader(CglibProxy.class.getClassLoader());
        //设置被代理对象
        enhancer.setSuperclass(target.getClass());
        //增强功能代码编写的位置
        MethodInterceptor methodInterceptor=new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("-------------cglib log--------------");
                Object invoke = method.invoke(target, objects);
                System.out.println("-------------cglib log--------------");
                return invoke;
            }
        };
        enhancer.setCallback(methodInterceptor);
        //代理对象
        Object o = enhancer.create();
        return o;
    }
}

测试:

    @Test
    public void test03() {
        Aoo aoo=new Aoo();
        CglibProxy cglibProxy = new CglibProxy(aoo);
        Aoo proxy = (Aoo) cglibProxy.getProxy();
        String info = proxy.test01("java");
        System.out.println("info = " + info);
    }

运行效果:

Spring静态代理和动态代理概念及使用方法是什么

4)动态代理的优势

  • 可以使得真实角色更加纯粹,不再去关注一些公共的事情。

  • 公共的业务由代理来完成,实现了业务的分工。

  • 公共业务发生扩展时变得更加集中和方便。

  • 一个动态代理,一般代理某一类业务。

  • 一个动态代理可以代理多个类,代理的是接口。

Spring静态代理和动态代理概念及使用方法是什么

感谢各位的阅读,以上就是“Spring静态代理和动态代理概念及使用方法是什么”的内容了,经过本文的学习后,相信大家对Spring静态代理和动态代理概念及使用方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节
推荐阅读:
  1. 如何实现Spring监听器和定时任务
  2. SpringBoot注解(举一反三,发散思维)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring
  • 上一篇新闻:
    js二进制数据及其互相转化如何实现
  • 下一篇新闻:
    Python怎么使用百度通用API进行翻译

猜你喜欢

  • ubuntu终端如何运行Python
  • redis怎么创建频道
  • curl如何支持ssl
  • 防止SQL注入的方法有哪些
  • 如何测试云服务器端口
  • iis如何支持ssl
  • 怎么让FTP支持ssl
  • redis如何实现异步队列
  • redis如何配置日志文件
  • 哪些工具可以防止sql注入
最新资讯
  • Kali Linux的Docker镜像如何使用
  • Kali Linux是否支持容器化技术
  • 如何向Kali Linux的开发者提交bug报告或建议
  • Kali Linux是否有官方支持的论坛或邮件列表
  • Kali Linux的社区支持是否活跃
  • Kali Linux如何与其他Linux发行版进行比较
  • Kali Linux是否有官方的在线教程或视频教程
  • Kali Linux是否支持多语言界面
  • Kali Linux的更新策略是什么
  • Kali Linux的Clonezilla工具如何使用
相关推荐
  • 网红框架SpringBoot2.x之花式运行项目
  • Spring Security七:授权
  • Spring注解配置和xml配置优缺点有哪些
  • Spring Security六:自定义认证
  • Spring Security五:Spring security原理
  • Spring 注入Bean时为null
  • 构建Spring Cloud微服务北京赛车平台架设详细步骤
  • Spring框架中怎么调用HanLP分词
  • Spring Security OAuth2 Login
  • 江帅帅:精通 Spring Boot 系列 06

相关标签

spring boot 入门 springmvc+mybatis springcloud gateway spring框架 spring boot 2.x 实战教程 spring cloud alibab spring framework spring aop spring.factories spring5 spring-mvc spring data springboot.plus spring-cloud spring4 spring bean springmvc4 Spring-IOC springsession spring.net
AI

深圳SEO优化公司果洛品牌网站设计价格民治英文网站建设价格大同百度竞价报价宜昌外贸网站制作公司郴州网络营销多少钱乐山网站优化按天计费价格定西百度标王铜仁模板制作公司松岗百姓网标王推广哪家好厦门百度竞价包年推广哪家好广安SEO按天扣费价格桐城关键词按天扣费多少钱平湖网站设计模板防城港优秀网站设计多少钱南京百度爱采购推荐仙桃网站改版哪家好南宁关键词排名多少钱珠海百搜标王遂宁网络推广公司德宏高端网站设计多少钱四平网站制作设计多少钱海东百度seo价格辽阳网络营销价格泰州网络营销多少钱嘉兴企业网站建设推荐惠州网站制作设计价格白山seo网站优化报价铜仁网站改版报价济南关键词排名包年推广推荐林芝关键词按天扣费报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化