一、代理模式
1.动态代理
JDK代理
//代理工厂
public class ProxyInvocationHandler implements InvocationHandler {
private Object target;
//获取被代理的对象
public void setUserDao(UserDao userDao) {
this.target = userDao;
}
//动态代理的方法,也就是下面Proxy的this参数,由于本类以及实现了InvocationHandler 接口,所有可以传入本类的对象
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("jdk代理方法执行了");
return method.invoke(target, args);
}
//获得代理方法
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
}
cglib代理
- cglib代理可以对没有实现接口的类进行代理
- 不能代理final修饰的class
maven依赖包
<!-- cglib无接口动态代理 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
public class ProxyFactory implements MethodInterceptor {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
/**
* 实现对被代理对象方法的调用
* 此方法会被自动提交
* @param o
* @param method
* @param args
* @param methodProxy
* @return 代理对象
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib代理模式执行");
Object invoke = method.invoke(target, args);
System.out.println("cglib代理提交");
return invoke;
}
/**
* 创建代理对象
* @return 返回被代理类
*/
public Object getProxyInstance() {
//创建一个工具类(增强剂)
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
}