- 浏览: 110398 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lang_meng:
为什么要这样呢?
json在js里用eval解析的问题 -
花岗岩:
简单且精辟
include指令与include动作 -
chenpingtai2008:
你好,在学习velocity,看了你文章,有些疑问帮忙解答下吧 ...
velocity 学习进阶 -
gatusso52:
另有一篇文章那么在一个完整的J2EE系统中应该如何进行合理的设 ...
PO、VO、FormBean
什么是代理模式:
代理模式的作用其实就是为一个对象提供一种代理以控制这个对象,然后把这个代理提供给别人来使用。
代理模式会在那些情况下使用呢 ?
在某些情况下,一个客户不想或者不能直接引用 或者说在引用目标对象前后要进行一些额外的工作 时候,代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的角色有 3 种:
抽象角色
:声明真实对象和代理对象的共同接口;
代理角色
:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口
以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作前后,附加其他的操作,相当于对真实对象进行封装
一些额外的服务。
真实角色
:代理角色所代表的真实对象,是代理最终要引用的对象。
===============================================================================
例子:
抽象角色:
package net.sx.staticProxy; public interface SayHello { public void say(); }
真实角色:
package net.sx.staticProxy; public class SayHelloImpl implements SayHello{ public void say() { System.err.println("hello!");; } }
===============================================================================
那么:
静态代理:
package net.sx.staticProxy; public class SayHelloProxy implements SayHello{ SayHello s ; public SayHelloProxy(SayHello s){ this.s=s; } public void say() { System.err.println("before static"); s.say(); System.err.println("after static"); } }
调用:
package net.sx.staticProxy; public class Test { public static void main(String[] args) { SayHello a = new SayHelloImpl(); SayHello p = new SayHelloProxy(a); p.say(); } }
===============================================================================
动态代理:
package net.sx.dynamicProxy; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyHandler implements InvocationHandler{ private Object proxyObj ; public MyHandler(Object proxyObj){ this.proxyObj = proxyObj; } public Object invoke(Object proxy,Method method,Object[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{ Object result = null; System.err.println("before dynamic"); result = method.invoke(proxyObj, args); System.err.println("after dynamic"); return result; } }
调用:
package net.sx.dynamicProxy; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { SayHello s = new SayHelloImpl(); SayHello p = (SayHello)Proxy.newProxyInstance(SayHello.class.getClassLoader(), new Class[]{SayHello.class}, new MyHandler(s)); p.say(); } }
===============================================================================
另用spring实现代理:
Advice:
package net.sx.springProxy; import org.aopalliance.intercept.MethodInvocation; import org.aopalliance.intercept.MethodInterceptor; public class MyInterceptor implements MethodInterceptor{ public Object invoke(MethodInvocation invocation) throws Throwable{ Object result=null; System.err.println("before spring"); result = invocation.proceed(); System.err.println("after spring"); return result; } }
xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="sayHelloImpl" class="net.sx.springProxy.SayHelloImpl" /> <bean id="myInterceptor" class="net.sx.springProxy.MyInterceptor" /> <bean id="sayHelloBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>net.sx.springProxy.SayHello</value> </property> <property name="interceptorNames"> <list> <value>myInterceptor</value> <value>sayHelloImpl</value> </list> </property> </bean> </beans>
调用:
package net.sx.springProxy; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext ctx = new FileSystemXmlApplicationContext( "/net/sx/springProxy/aop_bean.xml"); SayHello sayHelloBean = (SayHello)ctx.getBean("sayHelloBean"); sayHelloBean.say(); } }
发表评论
-
OO的原则
2009-06-22 02:59 8231 单一职责原则 一 ... -
解释器模式
2009-06-22 02:44 755用于文法分析中,平时很少用到,故省略 -
访问者模式
2009-06-22 01:52 7521解决问题: 有稳定的数据结构,易变的算法。 换句 ... -
备忘录模式
2009-06-22 01:26 7831 解决问题: 一些对象的状态可能需要“回滚”, ... -
迭代器模式
2009-06-21 16:52 712public interface A{ public AI ... -
中介者模式
2009-06-21 16:33 10021 解决问题 一群平级的对象要互相调用(通信),于是系统变得 ... -
策略模式
2009-06-21 16:18 7101 解决方案 一个固定的问题,但是有n中算法可以解决 ... -
责任链模式
2009-06-21 15:31 11511 解决问题 有不同的问题解决者,每人只负责一部分的类型的请 ... -
状态模式
2009-06-21 14:17 10341 解决问题 一个对象,有一系列的状态,每个状态对应一种 ... -
命令模式
2009-06-21 12:48 650面向对象的回调函数?? 1 解决问题 命令方发 ... -
享元模式
2009-06-20 14:53 8161 解决问题: 享元的意思,就是细粒度的对象 通过 ... -
装饰模式
2009-06-20 14:52 8991 解决问题: 一个基本的类,现在我想让它在创建的时 ... -
组合模式
2009-06-20 14:10 7311 解决问题 树形结构的一组对象 对象在不同的层次上,有的 ... -
外观模式
2009-06-20 13:53 6691 解决问题 层的概念: 底层有一堆类相互协作,此时如果高层 ... -
适配器模式
2009-06-20 13:41 7171 解决问题 已有一个功能类Adaptee,是可以解决a问题 ... -
工厂模式系列 + 反射改进
2009-06-20 02:14 8381 简单工厂模式 一个 ... -
原型模式
2009-06-20 01:45 8131 解决问题 一组对象,它们的属性都大同小异 现在 ... -
建造者模式
2009-06-20 01:23 8271 解决问题: 一个复杂对象 建造它可以拆成若干个步 ... -
模板方法模式
2009-06-20 00:37 669最常见的一种模式 就是一个抽象类里定义公有的不变的代码 ... -
桥接模式总结
2009-06-19 15:56 803目的: 一个系统可以从多个维度进行分类,而且每一维的 ...
相关推荐
此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。
- 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...
代理模式及手实现动态代理(aop原理)一、代理模式1. 定义2. 示例(1)静态代理(2)动态代理3. 通用类图4. 代理模式的优点二、jdk动态代理实现原理1. jdk动态代理源码分析(通过该示例学会阅读源码的方法)2.jdk动态...
SpringAOP代理设计模式demo代码实现,从静态代理、动态代理两方面进行了编码实现
Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比 动态代理的实际应用 Spring AOP
第二天内容:AOP(AOP常用概念、Spring的三种aop实现方式、代理设计模式(静态代理和动态代理));第三天内容:Spring自动装配,Spring自动加载properties文件,单例设计模式,声明式事务,Ajax,JSON。 --author:
spring-3 演示使用动态代理模式实现面向切面编程 使用注解方式进行AOP编程及使用配置xml方式进行AOP编程 spring-4 演示了spring与JDBCTemplate配合使用 spring-5 演示了声明式事务及使用xml配置文件处理事务
SpringAOP概念拓展: 73 之前实现了目标方法的动态调用,现在来实现切面的动态调用。 74 4.2.2 AOP实现的两种模式 78 4.2.2.1 xml形式 78 XML形式拓展: 81 异常通知处理例子: 91 不用spring异常通知,另一种处理...
依赖注入 构造函数注入 import Bean的自动装配 使用注解 实现自动装配 注解开发 使用java的方法配置Spring 代理模式 静态代理 加深理解 AOP AOP操作(准备) AOP操作(AspectJ配置文件) jdbcTemplate(概念和准备)
静态代理:由程序员创建或工具生成代理类的源码,再编译代理类,在程序运行前就产生了代理类的字节码文件,代理对象和目标对象的关系在程序运行前就决定了。 动态代理:在程序运行期间由JVM根据反射机制动态生成的,...
以及复杂度、Spring、SpringAPI、Spring2依赖注入、Spring注解、Spring数据访问、Spring 的MVC、Spring拦截器 过滤器、Spring面向切面编程(AOP)、代理模式(静态代理、动态代理)、反射原理、程序设计六大原则、...
Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 ...
掌握系统框架设计原理,工厂模式,委托模式的实现,Spring的IOC依赖注入技术,Struts2,Hibernate与Spring的整合,ApplicationContext读取资源文件的3种方法,多个配置文件的加载与导入,静态代理与动态代理,...
揭开springAOP神秘面纱(动态代理) Mysql性能优化之索引优化 写实现Tomcat服务器 移动后台端框架设计 公司级框架原理解析 解密公司内部框架开发(打造属于自己的专属框架) 手写Tomca之深度解析动态资源请求原理 深度...
代理模式 是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理...
静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量
代理模式 创建模式 抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例模式 行为模式 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板...
spring使用AOP面向切面的思想进行事务管理的。 spring和Hibernate继承后,定义事务管理特性的时候查询为什么要定义为read-only? 答:因为添加、删除和更新都涉及到了数据库的修改,而查询并未涉及到数据库修改,...
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织...
12.4springaop的代理工厂 253 12.4.1选择合适的代理 253 12.4.2proxyfactory 254 12.4.3proxyfactorybean 254 12.5项目实战——输出日志 256 本章小结 258 课后练习 259 第13章 spring与javaee持久化数据...