spring入门(13)---JDK动态代理
2013-05-16 08:32
363 查看
JDK动态代理
首先我们来了解一下java中的代理模式,代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
1、抽象主题角色
声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题
2、代理主题(Proxy)角色:
代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯地将调用传递给真实主题对象。
3、真实主题角色
定义了代理角色所代表地真实对象
JDK动态代理是基于接口的,必须实现了某一个或多个任意接口才可以被代理,并且只有这些接口中的方法会被代理.下面通过一个(男朋友要和女朋友分手)案例讲解JDK动态代理的实现.
1、创建一个接口
[java]
view plaincopyprint?
package www.csdn.spring.jdk.proxy;
//抽象主题 角色
public interface SayGoodBye {
/**
* 说的内容
* @param content
*/
public void say(String content);
}
2、创建接口的实现类。
[java]
view plaincopyprint?
package www.csdn.spring.jdk.proxy;
//这是主题角色
public class SayGoodByeImpl
implements SayGoodBye {
@Override
public void say(String content) {
System.out.println("say:" + content);
}
}
3、测试说明
[java]
view plaincopyprint?
package www.csdn.spring.jdk.proxy;
import org.junit.Test;
public class TestSay {
@Test
public void say(){
//创建对象
SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();
//调用say方法
sayGoodByeImpl.say("咱们分手吧!");
}
}
分析说明:上面创建SayGoodByeImpl的实例,调用了say方法,相当于男朋友自己给女朋友说咱们分手吧.但是男朋友不想和自己的女朋友直接说,想找一个中间人来说。那么就要使用到了代理。下面创建这样的代理类:
4、代理类
[java]
view plaincopyprint?
package www.csdn.spring.jdk.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* JDK动态代理
* @author redarmy
*/
public class JDKProxy
implements InvocationHandler {
// 代理目标对象
private Object target;
// 创建目标对象的的代理对象
public Object createProxyInstance(Object target) {
this.target = target;// 代理的目标对象
// 创建代理对象
// 1、定义代理类的类加载器
// 2、代理类要实现的接口列表
// 3、 指派方法调用的调用处理程序
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
/**
* proxy:目标对象的代理实例method:对于代理实例调用接口方法的Method实例args:方法参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 声明返回值
Object returnValue = null;
beforeMethod();
// 执行目标方法
returnValue = method.invoke(target, args);
afterMethod();
// 修改返回值
return returnValue;
}
public void beforeMethod(){
System.out.println("---------------------目标方法之前执行");
}
public void afterMethod(){
System.out.println("---------------------目标方法之后执行");
}
}
[java]
view plaincopyprint?
<PRE class=java name="code">package www.csdn.spring.jdk.proxy;
import org.junit.Test;
public class TestSay {
@Test
public void say(){
//真实主题角色
SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();
//代理角色
JDKProxy jdkProxy = new JDKProxy();
SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl);
//代理说:
sayProxy.say("你和他分手吧!!!");
}
}</PRE>
<PRE></PRE>
<P></P>
<PRE></PRE>
<P></P>
首先我们来了解一下java中的代理模式,代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
1、抽象主题角色
声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题
2、代理主题(Proxy)角色:
代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯地将调用传递给真实主题对象。
3、真实主题角色
定义了代理角色所代表地真实对象
JDK动态代理是基于接口的,必须实现了某一个或多个任意接口才可以被代理,并且只有这些接口中的方法会被代理.下面通过一个(男朋友要和女朋友分手)案例讲解JDK动态代理的实现.
1、创建一个接口
[java]
view plaincopyprint?
package www.csdn.spring.jdk.proxy;
//抽象主题 角色
public interface SayGoodBye {
/**
* 说的内容
* @param content
*/
public void say(String content);
}
package www.csdn.spring.jdk.proxy; //抽象主题 角色 public interface SayGoodBye { /** * 说的内容 * @param content */ public void say(String content); }
2、创建接口的实现类。
[java]
view plaincopyprint?
package www.csdn.spring.jdk.proxy;
//这是主题角色
public class SayGoodByeImpl
implements SayGoodBye {
@Override
public void say(String content) {
System.out.println("say:" + content);
}
}
package www.csdn.spring.jdk.proxy; //这是主题角色 public class SayGoodByeImpl implements SayGoodBye { @Override public void say(String content) { System.out.println("say:" + content); } }
3、测试说明
[java]
view plaincopyprint?
package www.csdn.spring.jdk.proxy;
import org.junit.Test;
public class TestSay {
@Test
public void say(){
//创建对象
SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();
//调用say方法
sayGoodByeImpl.say("咱们分手吧!");
}
}
package www.csdn.spring.jdk.proxy; import org.junit.Test; public class TestSay { @Test public void say(){ //创建对象 SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl(); //调用say方法 sayGoodByeImpl.say("咱们分手吧!"); } }
分析说明:上面创建SayGoodByeImpl的实例,调用了say方法,相当于男朋友自己给女朋友说咱们分手吧.但是男朋友不想和自己的女朋友直接说,想找一个中间人来说。那么就要使用到了代理。下面创建这样的代理类:
4、代理类
[java]
view plaincopyprint?
package www.csdn.spring.jdk.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* JDK动态代理
* @author redarmy
*/
public class JDKProxy
implements InvocationHandler {
// 代理目标对象
private Object target;
// 创建目标对象的的代理对象
public Object createProxyInstance(Object target) {
this.target = target;// 代理的目标对象
// 创建代理对象
// 1、定义代理类的类加载器
// 2、代理类要实现的接口列表
// 3、 指派方法调用的调用处理程序
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
/**
* proxy:目标对象的代理实例method:对于代理实例调用接口方法的Method实例args:方法参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 声明返回值
Object returnValue = null;
beforeMethod();
// 执行目标方法
returnValue = method.invoke(target, args);
afterMethod();
// 修改返回值
return returnValue;
}
public void beforeMethod(){
System.out.println("---------------------目标方法之前执行");
}
public void afterMethod(){
System.out.println("---------------------目标方法之后执行");
}
}
package www.csdn.spring.jdk.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * JDK动态代理 * @author redarmy */ public class JDKProxy implements InvocationHandler { // 代理目标对象 private Object target; // 创建目标对象的的代理对象 public Object createProxyInstance(Object target) { this.target = target;// 代理的目标对象 // 创建代理对象 // 1、定义代理类的类加载器 // 2、代理类要实现的接口列表 // 3、 指派方法调用的调用处理程序 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * proxy:目标对象的代理实例method:对于代理实例调用接口方法的Method实例args:方法参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 声明返回值 Object returnValue = null; beforeMethod(); // 执行目标方法 returnValue = method.invoke(target, args); afterMethod(); // 修改返回值 return returnValue; } public void beforeMethod(){ System.out.println("---------------------目标方法之前执行"); } public void afterMethod(){ System.out.println("---------------------目标方法之后执行"); } }5、测试说明
[java]
view plaincopyprint?
<PRE class=java name="code">package www.csdn.spring.jdk.proxy;
import org.junit.Test;
public class TestSay {
@Test
public void say(){
//真实主题角色
SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();
//代理角色
JDKProxy jdkProxy = new JDKProxy();
SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl);
//代理说:
sayProxy.say("你和他分手吧!!!");
}
}</PRE>
<PRE></PRE>
<P></P>
<PRE></PRE>
<P></P>
[java] view plaincopyprint?package www.csdn.spring.jdk.proxy; import org.junit.Test; public class TestSay { @Test public void say(){ //真实主题角色 SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl(); //代理角色 JDKProxy jdkProxy = new JDKProxy(); SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl); //代理说: sayProxy.say("你和他分手吧!!!"); } } package www.csdn.spring.jdk.proxy; import org.junit.Test; public class TestSay { @Test public void say(){ //真实主题角色 SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl(); //代理角色 JDKProxy jdkProxy = new JDKProxy(); SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl); //代理说: sayProxy.say("你和他分手吧!!!"); } }
相关文章推荐
- Spring学习心得(13)-- jdk动态代理
- jdk动态代理引起的spring事务不起作用
- jdk动态代理,spring核心动态代理
- 面试必备技能:JDK动态代理给Spring事务埋下的坑!
- Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- JDK动态代理给Spring事务埋下的坑
- spring AOP出现拦截无效的情况(一般是jdk动态代理失败)
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别
- 面试必备技能:JDK动态代理给Spring事务埋下的坑!
- Spring入门 静态代理 动态代理 CGLIB AOP切入点切面 AOP注解
- 基于JDK动态代理的经典Spring AOP
- Spring -- <tx:annotation-driven>注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)的区别。
- jdk动态代理引起的spring事务不起作用
- Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术
- Spring AOP注解失效的坑及JDK动态代理
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- Spring AOP之---基于JDK动态代理和CGLib动态代理的AOP实现
- JDK动态代理给Spring事务埋下的坑
- JDK动态代理干了什么事情?为什么我的事务会不起效?spring的事务到底应该怎么使用?原理是什么?