1.代理相关的概念
代理模式
代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用
抽象主题角色
声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题
代理主题(Proxy)角色
代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯地将调用传递给真实主题对象。
真实主题角色
定义了代理角色所代表地真实对象
spring有两种代理方式:
1.若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
2.若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
2.案例分析两种代理的异同
JDK动态代理
注意事项:编写JDK代理类引用的是java的工具包lang中的反射包下的Proxy,不需要引入其他jar包,但是要注意不要倒错包了;import java.lang.reflect.Proxy; 目标对象实现了若干接口。
两个接口类SayByeBye、SayGoodBye
CGLIB做代理
CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
注意事项:使用cglib做代理,java中不想jdk动态代理那样给封装好了相应的类,他需要导入所依赖的jar包asm-3.3.jar、cglib-2.2.jar这两个jar包;目标对象没有实现任何接口
目标类SayHello
package www.csdn.spring.proxy.cglib;
publicclass SayHello {
publicvoid say(String content) {
System.out.println("say:" + content);
}
}
cglib代理类CglibProxy
-
package www.csdn.spring.proxy.cglib;
-
-
import java.lang.reflect.Method;
-
-
import net.sf.cglib.proxy.Enhancer;
-
import net.sf.cglib.proxy.MethodInterceptor;
-
import net.sf.cglib.proxy.MethodProxy;
-
-
public class CglibProxy implements MethodInterceptor{
-
-
private Object target;
-
public Object createProxyInstance(Object target){
-
this.target = target;
-
-
Enhancer enhancer = new Enhancer();
-
-
enhancer.setSuperclass(this.target.getClass());
-
-
enhancer.setCallback(this);
-
-
return enhancer.create();
-
}
-
-
-
-
-
-
-
-
@Override
-
public Object intercept(Object proxy, Method method, Object[] args,
-
MethodProxy methodProxy) throws Throwable {
-
-
-
-
System.out.println("proxy:"+proxy.getClass());
-
System.out.println("method:"+method.getName());
-
System.out.println("methodProxy:"+methodProxy.getSuperName());
-
if(args!=null&&args.length>0){
-
for(Object obj : args){
-
System.out.println("args:"+obj);
-
}
-
}
-
-
-
Object returnValue = null;
-
beforeMethod();
-
-
-
returnValue = method.invoke(target, args);
-
afterMethod();
-
return returnValue;
-
}
-
-
public void beforeMethod(){
-
System.out.println("----方法执行之前的操作----");
-
}
-
public void afterMethod(){
-
System.out.println("----方法执行之后的操作----");
-
}
-
}
-
测试类proxyTest
-
package www.csdn.spring.proxy.cglib;
-
-
import org.junit.Test;
-
-
public class ProxyTest {
-
-
@Test
-
public void testSay() {
-
-
-
SayHello sayHello = new SayHello();
-
-
-
-
SayHello sh = (SayHello) new CglibProxy().createProxyInstance(sayHello);
-
sh.say("嗨!你好啊!");
-
}
-
-
}