设计模式——代理(静态代理,动态代理,Cglib)

静态代理

三要素:共同接口  真实对象 代理对象

功能:对原有功能以切面形式进行拓展而不改变原来的真实对象,但是当要拓展的功能比较多处理就比较麻烦;

//共同接口
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);
	}






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值