动态代理在spring里用的还是比较多的,像AOP就是动态代理的应用,也就是说要真正的理解AOP就要知道java的动态代理机制。要理解动态代理就要知道代理设计模式,简单来说代理设计模式应具备一个接口两个实现类,其中一个实现类进行实际的操作例如数据库的增删改查,另一个实现类则是进行逻辑的控制,这个类就是代理操作类这个类里面会有一个构造方法参数自然就是我们定义的接口。
1.动态代理的结构
动态代理只是在代理模式上减少了一个代理操作类,相应的加了一个类用于取得代理对象,这个类要实现InvocationHandler接口还需要借助Proxy类的支持。该类的代码如下
package org.useproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler{
Object obj;
public Object bind(Object obj){
this.obj=obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object temp=method.invoke(this.obj, args);
return temp;
}
}
我们可以看到代码中使用了反射机制,如果要知道invoke方法什么时候被调用就需要自己debug一下了
2.测试动态代理能否正常使用
package org.useproxy;
public class TestProxy {
public static void main(String[] args) {
MyInvocationHandler hand=new MyInvocationHandler();
CityManager c=(CityManager)hand.bind(new RealCityManagerImpl());
System.out.println(c.getAllCity());
}
}
运行结果如下
为了看得更明白我把真实主题实现类的代码页贴出来,如下所示:
package org.useproxy;
public class RealCityManagerImpl implements CityManager{
@Override
public String getAllCity() {
return "上海,嘉兴,杭州";
}
}