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
[java]
view plaincopyprint?
- 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("嗨!你好啊!");
- }
-
- }