- 浏览: 618920 次
- 性别:
- 来自: 杭州,长沙
-
文章分类
- 全部博客 (279)
- Java (30)
- Jsp、Servlet (18)
- Web前端 (56)
- Oracle (31)
- SqlServer (1)
- Jetty (3)
- Tomcat (6)
- Weblogic (11)
- Websphere (2)
- Struts2 (13)
- Spring (5)
- Ibatis (8)
- Hibernate (3)
- Webservice (1)
- C/C++ (2)
- Linux (13)
- Android (1)
- 正则表达式 (3)
- 网络组建 (3)
- 软件工程 (11)
- IDE使用技巧 (20)
- Windows操作技巧 (18)
- 养生之道 (1)
- 杂七杂八 (15)
- 心理保健 (1)
最新评论
-
50854319:
elements[i] = tagArr[i]; 这个需要修改 ...
document.getElementsByName在IE下的bug解决 -
mengsina:
通过楼主的介绍,能够启动client了。但是又遇到了cisco ...
(转)Cisco Systems, Inc. VPN使用过程中常见问题解决方案 -
zzz_robinson:
谢谢,关闭-启动-启动。这个循序对的,否则每次都提示服务没打开 ...
(转)Cisco Systems, Inc. VPN使用过程中常见问题解决方案 -
wuchunjiesp:
总算解决了,THANK楼主,空值问题是TYPE里面参数类型定义 ...
(原创)Ibatis2调用数据库存储过程的相关示例 -
wuchunjiesp:
存储里面是这样的
FOR I IN 1..P_GOODSDI ...
(原创)Ibatis2调用数据库存储过程的相关示例
首先要解释一下什么是代理模式:网上看了好多关于代理的解释我感觉都不是太令人满意,按照我个人的理解,代理模式的作用其实就是为一个对象提供一种代理以控制这个对象,然后把这个代理提供给别人来使用。代理模式会在那些情况下使用呢?在某些情况下,一个客户不想或者不能直接引用或者说在引用目标对象前后要进行一些额外的工作时候,代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的角色有3种:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作前后,附加其他的操作,相当于对真实对象进行封装一些额外的服务。
真实角色:代理角色所代表的真实对象,是代理最终要引用的对象。
静态代理:代理类中引用实在的被代理类;动态代理:代理类中不引用实在的被代理类,动态注入。
静态代理的实例:
抽象角色:UserDAO
publicinterface UserDAO {
publicvoid saveUser(User user);
}
真实角色:UserDAOImp
publicclass UserDAOImp implements UserDAO {
publicvoid saveUser(User user) {
}
}
代理角色:UserDAOProxy
publicclass UserDAOProxy implements UserDAO {
private UserDAO userDao;
UserDAOProxy(UserDAO userDao){
this.userDao = userDao;
}
publicvoid saveUser(User user) {
beforeSaveUser();
userDao.saveUser(user);
afterSaveUser();
}
privatevoid afterSaveUser() {
}
privatevoid beforeSaveUser() {
}
}
运行:
publicclass TestUserDAOProxy {
publicstaticvoid main(String[] args) {
UserDAO userDAO = new UserDAOImp();
UserDAO proxy = new UserDAOProxy(userDAO);
User user = new User();
proxy.saveUser(user);
}
}
动态代理的实例:
抽象角色:
publicinterface HelloWorld {
publicvoid sayHello();
}
真实角色:
publicclass HelloWorldImpl implements HelloWorld {
publicvoid sayHello() {
System.out.println("hello world");
}
}
Handler:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class HelloWorldHandler implements InvocationHandler {
Object obj;
HelloWorldHandler(Object obj) {
this.obj = obj;
}
public Object invoke(Object obj1, Method method, Object[] args)
throws Throwable {
this.doBefore();
Object o = method.invoke(obj, args);
this.doAfter();
return null;
}
public void doBefore() {
System.out.println("do this before");
}
public void doAfter() {
System.out.println("do this after");
}
}
具体调用:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;
publicclass TestProxy {
publicstaticvoid main(String[] args) throws IllegalArgumentException,
InstantiationException, IllegalAccessException,
InvocationTargetException {
HelloWorld hw1 = new HelloWorldImpl();
HelloWorldHandler hh = new HelloWorldHandler(hw1);
HelloWorld proxy1 = (HelloWorld) Proxy.newProxyInstance(hw1.getClass()
.getClassLoader(), hw1.getClass().getInterfaces(), hh);
//proxy1就是动态代理,这样就减少了代理和添加业务方法的耦合,具体业务以及添加的业务在handler里面已经实现
proxy1.sayHello();
hw1.sayHello();
}
}
从此可以看出动态代理是基于interface 和classloader动态创建一个代理对象,如果你能理解这点就很容易理解spring 的aop
看下面一段代码,来源于spring in action:
<beans>
<bean id="quest"
class="com.springinaction.chapter01.knight.HolyGrailQuest" />
<bean id="knightTarget"
class="com.springinaction.chapter01.knight.KnightOfTheRoundTable">
<constructor-arg>
<value>Bedivere</value>
</constructor-arg>
<property name="quest">
<ref bean="quest" />
</property>
</bean>
<bean id="minstrel"
class="com.springinaction.chapter01.knight.MinstrelAdvice" />
<bean id="knight"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>
com.springinaction.chapter01.knight.Knight
</value>
<value>
com.springinaction.chapter01.knight.Knight2
</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>minstrel</value>
</list>
</property>
<property name="target">
<ref bean="knightTarget" />
</property>
</bean>
</beans>
BeanFactory factory = new XmlBeanFactory(new ClassPathResource(
"applicationContext.xml"));
Knight knight = (Knight) factory.getBean("knight");
//knight就是一个动态代理对象!
knight.embarkOnQuest();
看到上面的配置文件,然后再看一下动态代理,你会发现spring 的aop就是基于动态代理模式来实现的
发表评论
-
Intellij idea各历史版本下载
2012-09-26 16:59 2627http://devnet.jetbrains.net/doc ... -
正确使用 Volatile 变量
2010-12-10 11:14 848Java 语言中的 volatile 变量可以被看作是一种 “ ... -
关于设计模式,有兴趣的可以交流交流!
2010-09-26 18:40 1002近日,一同学说QQ校友中的QQ餐厅这个应用很有意思,强烈推荐我 ... -
深入HashCode方法
2010-09-06 16:04 972为什么HashCode对于对象 ... -
(转)java 内部类的作用分析
2010-01-28 17:26 2961提起Java内部类(Inner Class)可能很多 ... -
J2EE程序的性能优化技巧
2009-11-10 17:12 930应用J2EE平台开发的系统的性能是系统使用者和开发者都关注 ... -
ArrayList和LinkedList区别
2009-09-17 18:16 1327ArrayList和LinkedList是两个集合类,用于存储 ... -
算法---排序
2009-09-17 18:10 1532排序的关键字 时间复杂度:整个排序算法运行所需要的时间 ... -
java性能优化之:使用Stack变量
2009-08-18 16:54 1614/** * @(#)TestProfile.j ... -
总结下java中abstract,interface,final,static,加深理解
2009-08-18 11:20 2210一,抽象类:abstract 1,只要有一个或一个以 ... -
JNDI配置数据源
2009-07-16 16:58 742一.web容器的配置 不同的web容器的配置都略有不 ... -
Java中GC的工作原理详解
2009-06-26 13:41 1206一个优秀的Java程序员必须了解GC的工作原理、如何优化GC的 ... -
log4j.properties详解
2009-04-08 12:36 38921、配置根Logger 其语法为: ... -
在java中动态执行一段代码
2009-03-31 18:14 1881动态的执行一段简单代码,采用生成ja ... -
Java SE6调用Java编译器的两种新方法
2009-03-31 18:09 1371在很多Java应用中需要在程序中调用Java编译器来编 ... -
程序员必读--关于Java占用内存的研究
2009-03-31 17:34 1093最近对程序占用内存方 ... -
Java 中对文件的读写操作之比较
2009-03-31 17:17 1013Java 对文件进行读 ... -
必备的 Java 参考资源列表
2009-03-16 13:59 838本文转载自:http://www.ibm. ... -
JAR 文件揭密
2009-03-16 11:35 912本文转载自:http://www.ibm.com/develo ... -
写出漂亮代码七种方法
2009-03-16 11:12 898本篇文章来源于 黑客基 ...
相关推荐
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
6. **代理模式的其他实现**:除了Java的动态代理,还有其他实现方式,比如CGLIB库,它通过字节码生成技术创建代理对象,即使目标类没有实现接口也能进行代理。 学习AOP动态代理有助于我们理解面向切面编程的核心...
代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了软件工程中的开闭原则。 - **...
代理模式在Java中主要有两种实现方式:静态代理和动态代理,其中动态代理又分为JDK动态代理和CGlib代理。 1. 静态代理 静态代理是程序员手动创建代理类并实现与目标类相同接口的方式。在静态代理中,代理类和目标类...
本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...
本案例"Spring模拟aop静态代理案例"旨在帮助开发者深入理解Spring AOP在实际应用中的运作方式,特别是静态代理的概念。 AOP(Aspect Oriented Programming)是一种编程范式,它允许程序员将关注点(如日志、事务...
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...
代理模式可以分为静态代理和动态代理两种。静态代理是通过手动编写代理类来实现代理的,而动态代理则是通过使用代理工厂或代理类生成器来生成代理对象。 二、静态代理 静态代理是通过手动编写代理类来实现代理的。...
在Java中,代理模式主要有两种实现方式:静态代理和动态代理。 1. 静态代理: 在静态代理中,我们需要手动创建一个代理类,这个代理类实现了与目标类相同的接口。代理类中会持有目标对象的引用,并在调用目标对象...
【Spring AOP的静态代理和动态代理】 在软件开发中,代理模式是一种常见的设计模式,它允许我们在不修改原有对象的基础上,对对象的行为进行增强。代理模式的核心思想是通过代理对象来控制对原始对象(也称为委托...
Java Spring 代理模式 AOP-IOC 结合 从给定的文件信息中,我们可以总结出以下知识点: 一、为什么需要代理模式 在软件开发中,我们经常会遇到一些非功能性需求,如日志记录、身份验证、性能监控等,这些需求会...
总结,Java代理模式提供了两种实现方式,静态代理适用于代理类数量较少且不需要频繁改动的情况,而动态代理则更加灵活,适用于代理类数量多或者需要动态改变代理行为的场景。了解并熟练运用这两种代理模式,可以极大...
静态代理是在编译时就已经确定了代理类,而动态代理则是在运行时动态创建的。Java中,JDK的Proxy类和CGLIB库可以实现动态代理。 日志拦截器是AOP的一个常见应用场景。在Spring框架中,我们可以利用AOP和代理模式来...
静态代理和动态代理都是 Spring AOP里的重要概念,都是实现代理模式的不同方式。静态代理适合于小规模的项目,动态代理适合于大规模的项目。 Spring AOP里的静态代理和动态代理用法详解对大家的学习或者工作具有一定...
在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...
代理模式主要有两种形式:静态代理和动态代理。 1. **静态代理** 静态代理在程序运行前就已经存在,代理类和被代理类的关系是明确的。实现过程包括: - 定义一个公共接口,被代理类和代理类都实现该接口。 - 被...
动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...
本篇我们将深入探讨Spring中的静态代理和动态代理,这两种代理模式在实际开发中都有广泛的应用。 首先,让我们理解什么是代理。代理模式是一种设计模式,它为一个对象提供一个代理以控制对这个对象的访问。在Spring...