首先要解释一下什么是代理模式:网上看了好多关于代理的解释我感觉都不是太令人满意,按照我个人的理解,代理模式的作用其实就是为一个对象提供一种代理以控制这个对象,然后把这个代理提供给别人来使用。代理模式会在那些情况下使用呢?在某些情况下,一个客户不想或者不能直接引用或者说在引用目标对象前后要进行一些额外的工作时候,代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的角色有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就是基于动态代理模式来实现的
相关推荐
此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。
- 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...
Java各种代理模式以及AOP的实现代码 : 1.AspectJ - 静态代理 2. 动态代理 (1)JDK动态代理 (2)CGlib代理
代理模式及手实现动态代理(aop原理)一、代理模式1. 定义2. 示例(1)静态代理(2)动态代理3. 通用类图4. 代理模式的优点二、jdk动态代理实现原理1. jdk动态代理源码分析(通过该示例学会阅读源码的方法)2.jdk动态...
在了解动态代理前,我们需要先了解一下什么是代理模式。 代理模式 代理模式(Proxy Pattern)是 23 种设计模式的一种,属于结构型模式。他指的是一个对象本身不做实际的操作,而是通过其他对象来得到自己想要的结果...
这是一个aop思想的实现。配合本博客文章《aop》。其中有3个包,一个没有实现aop,一个用静态代理实现aop,一个使用java的动态代理机制实现aop。
aop思想的java代码实现。代码分三个部分,一个是不使用aop思想实现日志记录,一个是使用静态代理实现aop,最后是使用java 1.3之后的动态代理机制实现。
Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比 动态代理的实际应用 Spring AOP
SpringAOP代理设计模式demo代码实现,从静态代理、动态代理两方面进行了编码实现
基本概念: 代理模式的核心作用就是通过代理,控制对对象的访问。 这跟实际中是一样的,例如说我们租房子时遇到的中介,这就是一个代理,比如有人要找中介帮忙出租房屋,那么首先处理这事的就是中介,虽然自己的...
第二天内容:AOP(AOP常用概念、Spring的三种aop实现方式、代理设计模式(静态代理和动态代理));第三天内容:Spring自动装配,Spring自动加载properties文件,单例设计模式,声明式事务,Ajax,JSON。 --author:
依赖注入 构造函数注入 import Bean的自动装配 使用注解 实现自动装配 注解开发 使用java的方法配置Spring 代理模式 静态代理 加深理解 AOP AOP操作(准备) AOP操作(AspectJ配置文件) jdbcTemplate(概念和准备)
以及复杂度、Spring、SpringAPI、Spring2依赖注入、Spring注解、Spring数据访问、Spring 的MVC、Spring拦截器 过滤器、Spring面向切面编程(AOP)、代理模式(静态代理、动态代理)、反射原理、程序设计六大原则、...
代理模式拓展: 52 4.1.1 JDK动态代理 58 JDK动态代理拓展: 59 4.1.2 CGLIB做代理 66 CGLIB动态代理拓展: 68 4.1.3 Spring的动态代理 71 4.2 AOP编程 71 4.2.1概念: 71 SpringAOP概念拓展: 73 之前实现了目标...
静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量
揭开springAOP神秘面纱(动态代理) Mysql性能优化之索引优化 写实现Tomcat服务器 移动后台端框架设计 公司级框架原理解析 解密公司内部框架开发(打造属于自己的专属框架) 手写Tomca之深度解析动态资源请求原理 深度...
代理模式 是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理...
静态代理:由程序员创建或工具生成代理类的源码,再编译代理类,在程序运行前就产生了代理类的字节码文件,代理对象和目标对象的关系在程序运行前就决定了。 动态代理:在程序运行期间由JVM根据反射机制动态生成的,...
spring-3 演示使用动态代理模式实现面向切面编程 使用注解方式进行AOP编程及使用配置xml方式进行AOP编程 spring-4 演示了spring与JDBCTemplate配合使用 spring-5 演示了声明式事务及使用xml配置文件处理事务
代理模式 创建模式 抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例模式 行为模式 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板...