动态代理,一个耳熟的名字,他有一些什么作用了?可以简单的理解为给该业务添加一个额外的功能
就比如我的房子要出租,但是我有不想自己去处理带租客看房,一些乱七八糟的手续这些事情,而你只负责收租费,这时,就有房产中介(代理),可以帮你处理,你就是被代理的对象
这里通过一个简单的例子来说明下
IUserDao
package com.asiainfo.spring.proxy;
public interface IUserDao {
public void add();
public void query();
public void delete();
public void update();
}
UserInfo
package com.asiainfo.spring.proxy;
public class UserInfo implements IUserDao{
public void add(){
System.out.println("add");
}
public void query(){
System.out.println("query");
}
public void delete(){
System.out.println("delete");
}
public void update(){
System.out.println("update");
}
}
UserProxy
package com.asiainfo.spring.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class UserProxy implements InvocationHandler{
private UserProxy(){
}
//代理的目标对象
private Object target;
public static Object getInstance(Object proxy){
UserProxy userProxy = new UserProxy();
userProxy.target=proxy;
//第一个参数,是被代理对象的ClassLoader,第二个参数,是被代理对象的所有接口,第三个参数,代理对象(继承InvocationHandler)
Object result = Proxy.newProxyInstance(proxy.getClass().getClassLoader(), proxy.getClass().getInterfaces(),userProxy);
return result;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(method.getName().equals("add")){
System.out.println(123);
}
if(proxy instanceof IUserDao){
IUserDao userInfo =(IUserDao) proxy;
userInfo.add();
}
//执行被代理对象的方法
Object obj = method.invoke(target, args);
return obj;
}
}
从UserProxy类可以发现,我们可以在执行被代理对象的前后,添加额外的功能
测试:
package com.asiainfo.spring;
import com.asiainfo.spring.proxy.IUserDao;
import com.asiainfo.spring.proxy.UserInfo;
import com.asiainfo.spring.proxy.UserProxy;
public class TestProxy {
public static void main(String[] args) {
IUserDao UserInfo = (IUserDao) UserProxy.getInstance(new UserInfo());
UserInfo.add();
UserInfo.delete();
}
}
结果
123
add
delete