静态代理
三要素:共同接口 真实对象 代理对象
功能:对原有功能以切面形式进行拓展而不改变原来的真实对象,但是当要拓展的功能比较多处理就比较麻烦;
//共同接口
public interface TaskInterface {
String doJob(String content);
}
//真实对象
public class RealWorker implements TaskInterface{
@Override
public String doJob(String content) {
System.out.println("这是我完成的工作---realWork");
return content;
}
}
//代理对象
public class StaticProxy implements TaskInterface {
private TaskInterface target;
//持有被代理对象
public StaticProxy(TaskInterface target) {
this.target=target;
}
@Override
public String doJob(String content) {
System.out.println("静态代理做的工作1");
//被代理对象执行任务前后代理类做其他工作
target.doJob(content);
System.out.println("静态代理做的工作2");
return content;
}
public static void main(String[] args) {
String result = new StaticProxy(new RealWorker()).doJob("结果");
System.out.println(result);
}
}
动态代理
使用动态代理,可以通过在运行时,动态生成一个持有RealObject、并实现代理接口的Proxy,同时注入我们相同的扩展逻辑
//共有接口
public interface TaskInterface {
String doWork(String content);
}
//真实类
public class RealWorker implements TaskInterface {
@Override
public String doWork(String content) {
System.out.println("这是realWorker完成的工作");
return content;
}
}
public class DynamicProxy {
public static void main(String[] args) {
ClassLoader loader = RealWorker.class.getClassLoader();
Class<?>[] interfaces = RealWorker.class.getInterfaces();
InvocationHandler h = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
System.out.println("动态代理干的事1");
Object result = method.invoke(new RealWorker(), params);
System.out.println("动态代理干的事2");
return result;
}
};
//代理类与被代理类都要实现相同的接口
TaskInterface proxy = (TaskInterface) Proxy.newProxyInstance(loader, interfaces, h);
String result = proxy.doWork("传参要完成任务");
System.out.println(result);
}
}
Cglib
用cglib实现动态代理,并不要求代理类必须实现接口
原理:
通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑
//cglib不需要实现接口,是通过子类代理,因而其需被代理的方法,不能用fianl修饰
public class RealWork {
public String doJob (String content){
System.out.println("这是realWorker要干的事。。");
return "result: "+content;
}
}
public class CglibProxy implements MethodInterceptor{
@Override
public Object intercept(Object object, Method arg1, Object[] params, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib代理要干的事1");
Object result = methodProxy.invokeSuper(object, params);
System.out.println("cglib代理要干的事2");
return result;
}
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
//将被代理类设置为父类
enhancer.setSuperclass(RealWorker.class);
//回调实现了方法拦截器的代理方法
enhancer.setCallback(new CglibProxy());
//产生代理类
RealWorker proxy = (RealWorker) enhancer.create();
String result = proxy.doWork("传入的参数");
System.out.println(result);
}