一、JDK动态代理:Jdk动态代理只针对于接口操作
动态代理工厂类
public class JDKProxyFactory implements InvocationHandler {
private Object target;
public JDKProxyFactory(Object target) {
this.target = target;
}
//创建代理对象
public Object createProxy() {
//使用Proxy完成代理对象的创建
// 1.得到目标对象的classloader
ClassLoader classLoader = target.getClass().getClassLoader();
// 2.得到目标对象的实现接口的class[]
Class[] interfaces = target.getClass().getInterfaces();
return Proxy.newProxyInstance(classLoader, interfaces, this);
}
// 在代理实例上处理方法调用并返回结果。
// 参数1 就是代理对象,一般不使用
// 参数2它调用的方法的Method对象
// 参数3调用的方法的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return method.invoke(target, args);
}
}
动态代理测试
@Test
public void test1() {
//1.目标对象的创建
UserService userService = new UserServiceImpl();
//2.代理对象的创建
JDKProxyFactory jdkProxyFactory = new JDKProxyFactory(userService);
UserService createProxy = (UserService) jdkProxyFactory.createProxy();
createProxy.login();
}
UserServiceImpl
public class UserServiceImpl implements UserService {
@Override
public void login() {
// TODO Auto-generated method stub
System.out.println("login...");
}
@Override
public void regist() {
// TODO Auto-generated method stub
System.out.println("regist...");
}
}
二、Cglib动态代理
1、jdk的动态代理只可以为接口去完成操作,而cglib它可以为没有实现接口的类去做代理,也可以为实现接口的类去做代理。
2、spring采用的是哪一种动态机制:
如果目标对象,有接口,优先使用jdk动态代理
如果目标对象,无接口,使用cglib动态代理。
public class CglibFactory implements MethodInterceptor {
//得到目标对象
private Object target;
//用构造方法传递目标对象
public CglibFactory(Object target) {
this.target = target;
}
//创建代理对象
public Object createProxy() {
//1.创建Enhancer
Enhancer enhancer = new Enhancer();
//2.传递目标对象的class
enhancer.setSuperclass(target.getClass());
//3.设置回调操作(相当于InvocationHandler)
enhancer.setCallback(this);
return enhancer.create();
}
//类似于InvocationHandler中的invoke
@Override
public Object intercept(Object proxy, Method method, Object[] arg2,
MethodProxy methodProxy) throws Throwable {
// TODO Auto-generated method stub
return method.invoke(target, arg2);
}
}