定义
代理模式为另一个对象提供一个替身或者占位符以控制对这个对象的访问。
代码demo
静态代理
public interface UserDaoIpm {
void save();
}
public class UserDao implements UserDaoIpm{
public void save() {
System.out.println("-------------静态代理 -----保存成功---------------");
}
}
public class UserDaoProxy implements UserDaoIpm{
private UserDao userdao;
public UserDaoProxy(UserDao userdao) {
this.userdao=userdao;
}
public void save() {
System.out.println("start----------------");
userdao.save();
System.out.println("end-------------------");
}
}
public class AdminProxy {
private Object target;
public AdminProxy(Object target) {
this.target = target;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start-------");
Object invoke = method.invoke(target, args);
System.out.println("end");
return invoke;
}
});
}
}
动态代理
public class AdminDao implements UserDaoIpm{
public void save(){
System.out.println("动态代理----保存成功");
}
}
public class AdminProxy {
private Object target;
public AdminProxy(Object target) {
this.target = target;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start-------");
Object invoke = method.invoke(target, args);
System.out.println("end");
return invoke;
}
});
}
}
CGLIB代理
public class GroupDao {
public void save(){
System.out.println("--------CGLIB代理------保存-------------");
}
}
public class GroupdaoProxy implements MethodInterceptor{
private Object target;
public GroupdaoProxy(Object target) {
this.target = target;
}
//为目标对象生成一个代理对象
public Object getProxyInstance(){
Enhancer en = new Enhancer();
en.setSuperclass(target.getClass());
en.setCallback(this);
return en.create();
}
public Object intercept(Object obj, Method method, Object[] param, MethodProxy proxy) throws Throwable {
System.out.println("start--------");
Object returnValue = method.invoke(target, param);
System.out.println("end-------");
return returnValue;
}
}
单元测试
/**
* 静态代理(目标对象和代理对象实现同样的接口)
* 动态代理(目标对象必须实现接口,代理对象不需要实现接口)
* CGLIB代理:不需要实现任何接口
*/
public class UnitTest {
public static void main(String[] args) {
//静态代理
// UserDao dao = new UserDao();
// UserDaoProxy proxy1 = new UserDaoProxy(dao);
// proxy1.save();
//动态代理
// UserDaoIpm dao = new AdminDao();
// System.out.println(dao.getClass());
// UserDaoIpm proxyInstance = (UserDaoIpm)new AdminProxy(dao).getProxyInstance();
// System.out.println(proxyInstance.getClass());
// proxyInstance.save();
//CGLIB代理
GroupDao dao = new GroupDao();
System.out.println(dao.getClass());
GroupDao proxy = (GroupDao)new GroupdaoProxy(dao).getProxyInstance();
System.out.println(proxy.getClass());
proxy.save();
}
}