当前位置:首页 > CN2资讯 > 正文内容

spring aop proxy 静态代理和动态代理spring动态代理

14小时前CN2资讯

代理的意义就在于,在访问真实的数据前我必须先访问它的代理,那么在客户端代码看来代理和实际的类应该没有分别—他们需要是同一类型。要做到是同一类型有两种方式,第一是代理类作为原类的子类,通过继承并重写父类的方法来达到目的;
最好的方式应该是实现同一接口,这就是接口的意义,接口的意义在于抽象,面向接口编程就是面向抽象编程。如果你的类有非static的public的方法,都应该考虑让他实现一个接口,很多时候我们会觉得给一个DAO或者service类多创建个interface是多余的,但是有朝一日你想到给他一个代理这样的需求的时候,你会发现如果他有个接口就完美了。
静态代理实现中,代理类与被代理类必须实现同一个接口。在代理类中可以实现记录等相关服务,并在需要时再呼唤被代理类,这样代理类就可以仅仅保留与业务相关的职责了。
例如:
接口

public interface Ihello { public void hello(String name); } 被代理类 public class HelloSpeaker implements Ihello{ @Override public void hello(String name) { System.out.println("hello "+name); } } 代理类 public class HelloProxy implements Ihello{ private Logger logger=Logger.getLogger(this.getClass().getName()); private Ihello helloObject; public HelloProxy(Ihello helloObject){ this.helloObject=helloObject; } @Override public void hello(String name) { log("hello method starts..."); helloObject.hello(name); log("hello method ends"); } private void log(String msg) { logger.log(Level.INFO, msg); } } 测试类 public class ProxyDemo { public static void main(String[] args) { //静态代理 Ihello proxy=new HelloProxy(new HelloSpeaker()); proxy.hello("Justin"); } 输出: 2017-4-3 9:58:37 javaEE.spring.proxy.serviceImp.HelloProxy log 信息: hello method starts... hello Justin 2017-4-3 9:58:37 javaEE.spring.proxy.serviceImp.HelloProxy log 信息: hello method ends 可以看到代理类的一个接口只能服务于一种类型的类,而且如果要代理的方法很多,势必要为每个方法进行代理 ,所以静态代理在程序规模稍大时必定无法胜任。 而动态代理不需要为特定类和方法编写特定的代理类,运用jdk1.3以后的可协助开发动态代理功能的API相关类别,使得一个处理者handler可以为各个类服务。 例如: 接口 public interface Ihello { public void hello(String name); } 被代理类 public class HelloSpeaker implements Ihello{ @Override public void hello(String name) { System.out.println("hello "+name); } } 处理类 public class LogHandler implements InvocationHandler { private Object sub; public LogHandler(){ } public LogHandler(Object obj){ sub=obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before you do thing"); method.invoke(sub, args); System.out.println("after you do thing"); return null; } } 测试 public class ProxyDemo { public static void main(String[] args) { //动态代理 HelloSpeaker helloSpeaker=new HelloSpeaker(); LogHandler logHandler =new LogHandler(helloSpeaker); Class cls=helloSpeaker.getClass(); Ihello ihello=(Ihello)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), logHandler); ihello.hello("Justin"); } }
    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24240.html

    分享给朋友:

    “spring aop proxy 静态代理和动态代理spring动态代理” 的相关文章

    Debian 修改DNS 设置的详细指南及常见问题解决方法

    了解DNS及其重要性 在日常使用网络的过程中,我们常会遇到“DNS”这个术语。简单来说,DNS(Domain Name System)是互联网的“电话簿”。它将我们输入的域名转换为计算机理解的IP地址,确保我们能够顺利访问网站。如果没有DNS,我们将不得不记住每一个网站的IP地址,那可真是太麻烦了!...

    深度解析韩国makemodel:传统与现代结合的时尚理念

    markdown格式的内容 韩国makemodel概念 谈到韩国makemodel,我首先感受到了它所传递的深厚文化底蕴。这一时尚理念融合了传统与现代,不仅仅是对衣物的设计,更是一种对韩国文化的致敬。它通过巧妙的配搭,将历史悠久的韩服元素与现代流行趋势相结合,创造出一种独特的美学风格。每一件作品都像...

    选择合适的云服务器配置:1c1g与1c2g的优缺点分析

    云服务器的配置选项相当多,其中1c1g和1c2g经常被提及。这两种配置分别代表1个CPU核心和不同的内存容量。1c1g代表1GB内存,而1c2g则有2GB内存。从我个人的经验来看,这两种配置在实际使用中各有其独特的优势。 1c1g配置详解 1c1g的配置相对基础,1个CPU核心加上1GB内存,特别适...

    VPS Pro - 理想的虚拟专用服务器解决方案

    什么是 VPS Pro VPS Pro 是一种先进的虚拟专用服务器解决方案,提供用户高度可定制的服务器环境。与传统的共享主机或物理服务器相比,VPS Pro 以虚拟化技术为基础,让每位用户享有像独立服务器一样的资源和灵活性。这种技术不仅提升了资源的利用率,还为用户提供了更高的控制权限。 在VPS P...

    选择最佳香港VPS大带宽服务的全面指南,助你无忧搭建在线业务

    在如今这个信息高速发展的时代,选择适合的VPS服务显得尤为重要。特别是香港VPS大带宽服务,以其独特的优势吸引了越来越多的用户。对于想要进行国际业务、网站托管或是搭建游戏服务器的用户来说,香港VPS大带宽服务绝对是个不错的选择。 香港VPS大带宽的优势显而易见。一个显著的特点是无需备案,这意味着用户...

    Hostwinds LLC:卓越的网络托管服务与高性价比优势

    Hostwinds LLC成立于2010年,位于美国西雅图。这家公司一直专注于提供多种网络托管服务,包括虚拟主机、虚拟专用服务器(VPS)和独立服务器。在这个竞争激烈的市场中,Hostwinds凭借其独特的优势和不断升级的服务赢得了客户的信赖。我个人认为,Hostwinds的历史反映了它对客户需求的...