`
wodamazi
  • 浏览: 1417643 次
文章分类
社区版块
存档分类
最新评论

Spring系列(2)--为什么需要动态代理

 
阅读更多

前一篇我把我自己实现动态包装的工厂类实现贴了出来,这一篇就来讲讲为什么要进行动态的代理。

理由看起来有以下几点:

1、有的时候我们需要为一些类的方法增加一些额外的责任,因为这些责任是额外的,去改动这些类当然是不好的。

对于这点,大家可以很快的想到用装饰模式或者代理模式去实现。当然,如果责任固定,而且是事先可预料的,可以在代码中预先进行处理,例如增加一个

框架型方法。不过这样一来,一是很难变化,而是使得与框架性方法的拥有者过度耦合,更不现实。

2、需要增加的额外责任不固定,而且需要增加额外责任的类本身也不固定。

虽然采用装饰或者代理(继承代理)模式,可以满足部分要求,但对于需要增加的额外责任不固定,又使得采用装饰模式和代理模式不太适合;而且如果需要增加责任的目标类本身也不固定,那么采用传统的方式,一个个的去写代理或装饰类就不太现实。

3、最关键的我们还希望在类的方法执行的时候,我们能与之有些互动

要实现这点,简单的代理或装饰是很难的了。

要满足上面几点的需求,不会很简单,但我们可以分析一下,我们的要求可以分为三个部分,一是增加额外责任,二是执行期间的交互,三是无缝透明化,也就是目标类能够应用的地方,我们的代理或装饰类也能够用,而且不需要任何额外的改装。我们先看一下二,因为如果二能够实现,增加额外的责任就很容易了,我们完全可以在交互过程中将这个责任委托给外部的对象来完成,这样不仅可以简化代理或装饰类,还使得责任的增加与代理或装饰类分离,在这种情况下,我们的代理类其实就只负责切入来监视(或者HOOK)目标方法,责任更加单一,方法更加简单,这样有利于这种代理类的动态生成。那么怎么实现交互呢,用命令模式是一个选择,但虽然说可以实现,但在代理类和附加责任类之间增加了一个命令层,有两个不利的地方,一是需要增加很多命令类,二是增加了通信里程。在前面的设计模式中我们分析过,命令模式一种更简洁的替代方法就是采用委托来实现,这里我们就采用委托或者事件来处理交互,就是代理类在执行目标方法期间通过委托与附加责任的对象进行交互。对于第三点,如果要做到无缝透明化,那么代理类或者装饰类就只能是目标类的子类了,因为面向对象编程中的继承一个最基本的法则就是父类可以应用的地方,子类都可以应用。二和三解决了,而一可以在交互过程中委托给外部对象实现,那么我们的三个要求都可以实现。我们的目的是为目标类增加额外的责任,通过交互,可以增加的责任也可以很多,从这个视角,很难有个明确的分类。那么我们就回到代理或装饰类的代理方法上,看看我们能够在哪些地方进行切入,能做哪些事情。下面的示意代码是一个典型的代理方法的代码形式:

A;

try

{

B;

Target.DoSomthing()//这里很关键,我们并不是直接执行基类的办法(虽然说也可以),而是调用代理类中目标类的一个引用的目标方法,这样做的目的就是尽量减轻代理类的责任,使得对于目标类与代理类的在创建上分离,在使用上也分离(因为并不是所有的情况都需要这种代理或者监视),代理类的责任更加单一。
C;

}

catch

{

D;

}

finally

{

E;

}

从上面可以看出,代理方法能够做的事情就是在执行目标方法前后增加一些责任。我们能够切入的点也就只有A-E5个点,其中A和B可以阻止目标方法的执行。我们对上面的代码再改进一下,如下:

try

{

A;//在目标方法执行前执行,但不干涉目标方法执行(当然,如果该方法执行中出现异常另当别论)

if(B1==true) //B1:这些交互结果会决定目标方法是否执行,但这些交互方法如何影响结果,是一票否决还是投票制,可根据自己需要决定,比较简单的当然是一票否决制。

{

B2,//在目标方法执行前执行,但是是在B1执行通过后后执行。

var theRet = Target.DoSomthing()

C1;//成功执行之后执行.

Return theRet;

}

C2;//这个点可以不要,放在A一起也可以。这个点是可以简化的.

}

catch

{

D;//异常处理交互处.

}

finally

{

E;//无论成功是否都要进行的交互.

}

能够切入的点就细分成7个,这当然很好,但可能有些复杂了,不过还是能胜任,这种细分,至少比Spring目前提供的切入点要细致些。搞清了切入点,我们就可以利用这个切入点来分类可以增加的额外责任。对于用户来说,就可以知道增加的责任可以在什么时机执行。

现在我们知道,我们可以用代理或装饰类来实现我们的需求,那么为什么要动态代理类呢?原因非常简单,就是我们懒,那么多不可预期的装饰或者代理类形式都差不多,虽然可以批量写,但这么多的类文件要维护本身就是一个麻烦的事情。能够动态的产生这些类,让计算机本身去管理这些类,当然更好。而且是现实的,可以实现的。前面1篇我们已经把实现动态代理的方法实现了。

这一篇我们还知道了这种增加额外责任和交互的方法,就是使用委托,下一篇,我们就来看看如何更好的去实现这种交互。

分享到:
评论

相关推荐

    spring-aop.zip

    Spring以JVM的动态代理技术为基础,设计出了一系列的AOP横切实现,比如前置通知、返回通知、异常通知等。同时,Pointcut接口可以匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进行切入...

    JAVA spring 系列案例50个和学习资料

    Spring系列第1篇:为何要学spring?Spring系列第2篇:控制反转(IoC)与依赖注入(DI)。Spring系列第3篇:Spring容器基本使用及原理。...Spring系列第15篇:代理详解(Java动态代理&cglib代理)?Spring系列

    Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc

    Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc

    springCloud

    而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置...

    Spring高级之注解驱动开发视频教程

    Spring框架是一系列应用框架的核心,也可以说是整合其他应用框架的基座。同时还是SpringBoot的基础。在当下的市场开发环境中,Spring占据的地位是非常高的,基本已经成为了开发者绕不过去的框架了。它里面包含了...

    spring-recipe-app:使用Spring Boot 5构建的食谱应用程序

    春天食谱应用使用Spring Boot 5构建的食谱应用程序关于Thymeleaf的事实Thymeleaf是自然的模板引擎。 它是JSP的替代品。 使用Thymeleaf,我们可以立即在浏览器中看到HTML,而JSP需要在运行时进行编译。Http方法GET-...

    spring-polymer-demo:使用Polymer前端和JavaSpring后端的演示应用程序

    ## Update Google已发布Polymer 1.0! 它与该项目所基于的0.5x(Dev Preview)版本明显不同。...polymer-ui :承载Polymer应用程序并充当服务代理的应用程序 resource :简单的ReSTful应用返回JSON数据 auth-ser

    Spring+mybatis+dubbo整合源代码及jar包

    此框架为Spring4.1.6+mybatis3.2.8+dubbo2.5.3的框架源码以及依赖的包

    59道SpringCloud面试题详解含答案(值得珍藏)

    它利用Spring Boot的开发便利性,简化了分布式系统基础设施的开发,为开发人员提供了一些快速构建分布式系统的工具,如配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等。...

    spring-cloud-example:春云的例子

    它为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话、集群状态管理)。Spring Cloud包含了多个子项目(针对...

    Spring.net框架

    我们的第一个例子主要用于说明程序的基本构造,并且作为一个反面典型,引出为什么要解耦,以及如何下手。在这个例子中,我们将创建三个程序集,分别是MainApp.exe、HelloGenerator.dll以及SayHello.dll。它们之间的...

    spring5系列 任小龙大神班

    STS工具、IoC、DI思想、Spring测试框架、bean的实例化、作用域、初始化、生命周期、静态代理、字节码加载原理、JDK动态代理和原理、CGLIB动态代理和原理、拦截器思想、AOP思想和开发、Spring对持久层技术支持、...

    深入理解Spring声明式事务:源码分析与应用实践

    这种代理机制基于Spring AOP实现,能够在运行时动态地管理事务的创建、提交或回滚。此外,Spring事务管理器支持多种类型的事务策略,包括不同的传播行为和隔离级别,允许开发者根据具体业务场景选择最合适的事务管理...

    互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析

    突破Java Web 研发瓶颈的束缚,选取Spring、SpringMVC 和MyBatis 框架中易于理解的版本,深入剖析了其中各个模块的实现,从代码中挖掘常用的设计模式,为读者理解Spring 系列框架的可扩展设计艺术提供了方法论和优秀...

    spring.net權限管理實例

    是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,它从一个不同于OOP的角度来看待程序的结构:OOP将应用程序分解为一系列表现为继承关系的对象;AOP 则把程序分解为一...

    互联网轻量级 ssm 框架解密 springspringmvcmybatis源码深度剖析

    突破Java Web 研发瓶颈的束缚,选取Spring、SpringMVC 和MyBatis 框架中易于理解的版本,深入剖析了其中各个模块的实现,从代码中挖掘常用的设计模式,为读者理解Spring 系列框架的可扩展设计艺术提供了方法论和优秀...

    4、Spring Security 安全权限管理手册

    2、SS中的验证特点 支持多种验证方式 支持多种加密格式 支持组件的扩展和替换 可以本地化输出信息 3、SS中的授权特点 支持多种仲裁方式 支持组件的扩展和替换 支持对页面访问、方法访问、对象访问的授权。 4、SS核心...

    Android代码-java-bible

    java-bible 这里记录了一些技术摘要,部分文章来自网络,本项目的目的力求分享...Jersey-2.x用户指南 REST 实战 Java Servlet 3.1 规范 MyBatis中文指南 Apache Shiro 用户指南 Spring Boot参考指南 Netty4 用户指南

    看透springMvc源代码分析与实践

    1.5.4 反向代理13 1.5.5 CDN14 1.6 底层的优化15 1.7 小结15 第2章 常见协议和标准17 2.1 DNS协议17 2.2 TCP/IP协议与Socket18 2.3 HTTP协议20 2.4 Servlet与Java Web开发22 第3章 DNS的设置23 3.1 DNS...

Global site tag (gtag.js) - Google Analytics