动态代理模式和责任链模式

来源:互联网 发布:java中poi是什么意思 编辑:程序博客网 时间:2024/06/05 14:30

代理:即中介的意思,比如客户,公司产品经理,软件工程师之间的管理。产品经理为代理者,软件工程师为被代理者。回到代码中,客户就是主程序,软件工程师就是切面程序1.最常用的代理技术有两种:JDK(jdk自带)和CGLIB(第三方提供的技术)。spring常用jdk和cglib,mybatis用Javassist。

2.JDK中我们必须使用接口(定义一个接口然后去实现这个接口),cglib不需要(更简单一点)

3.JDK代理中要实现代理逻辑类就必须去实现java.lang.reflect.InvocationHandler接口,他里面定义了一个invoke方法,并提供接口数组用于下挂代理对象。

例子如下

3.1定义被代理对象(真是对象)

3.11:接口

public interface HelloWorld {
public void sayHello(String name, int age);
public void getResult(String name);
}

3.12:接口实现类:

public class HelloWorldImp implements HelloWorld {
@Override
public void sayHello(String name, int age) {
// TODO Auto-generated method stub
System.out.println("我是" + name + "我" + age);
}


@Override
public void getResult(String name) {
System.out.println("我是" + name);
}


}

3.2:代理绑定和代理逻辑实现

public class JdkExample implements InvocationHandler {
private Object target = null;

//绑定,传入一个被代理对象,输出一个代理对象
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}

//设定代理逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("开始了");
Object object = method.invoke(target, args);
System.out.println("结束了");
return object;
}


}

//测试:

public class TestJdk {
public static void main(String[] args) {
JdkExample jdk = new JdkExample();
HelloWorld h = (HelloWorld) jdk.bind(new HelloWorldImp());
h.sayHello("lg", 25);
}


}

4.CGLIB动态代理

和jdk类似,但是需要导入架包,参考22页