接口
public interface IUserManager {
void addUser(String nickName,String password);
}
实现类1
public class UserManaerImpl implements IUserManager{
@Override
public void addUser(String nickName, String password) {
System.out.println("UserManaerImpl - Add user - nickName:" + nickName + "password:" + password);
}
}
实现类2
public class UserManagerImpl2 implements IUserManager{
@Override
public void addUser(String nickName, String password) {
System.out.println("UserManagerImpl2 - Add user - nickName:" + nickName + " password:" + password);
}
}
JDK动态代理
public class JDKDynamicProxy implements InvocationHandler {
private Object targetObject;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("数据缓冲...");
Object result = method.invoke(targetObject,args);
System.out.println("日志记录...");
return result;
}
public Object getProxy(Object targetObject){
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this);
}
}
CGLib动态代理
public class CGLibDynamicProxy implements MethodInterceptor {
private Object targetObject;
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("数据缓冲...");
Object result = method.invoke(targetObject,args);
System.out.println("日志记录...");
return result;
}
public Object getProxy(Object targetObject){
this.targetObject = targetObject;
return Enhancer.create(targetObject.getClass(),targetObject.getClass().getInterfaces(),this);
}
}
测试类
@RunWith(SpringJUnit4ClassRunner.class)
public class MyProxyTest {
@Test
public void test1(){
JDKDynamicProxy jdkDynamicProxy1 = new JDKDynamicProxy();
IUserManager userManager1 = (IUserManager) jdkDynamicProxy1.getProxy(new UserManaerImpl());
userManager1.addUser("NickName","PassWord");
JDKDynamicProxy jdkDynamicProxy2 = new JDKDynamicProxy();
IUserManager userManager2 = (IUserManager) jdkDynamicProxy2.getProxy(new UserManagerImpl2());
userManager2.addUser("NickName","PassWord");
CGLibDynamicProxy cgLibDynamicProxy = new CGLibDynamicProxy();
IUserManager userManager = (IUserManager)cgLibDynamicProxy.getProxy(new UserManaerImpl());
userManager.addUser("NickName","Password");
CGLibDynamicProxy cgLibDynamicProxy2 = new CGLibDynamicProxy();
IUserManager userManager3 = (IUserManager)cgLibDynamicProxy2.getProxy(new UserManagerImpl2());
userManager3.addUser("NickName","Password");
}
}
1)JDK应用场景:只能代理实现了接口的类
2)CGLIB应用场景:是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,
并覆盖其中方法实现增强,但是因为采用的是继承,所以该类或方法最好不要声明成final,
对于final类或方法,是无法继承的。