动态代理模式

一:动态代理定义(Spring的AOP底层实现):

为其他对象提供一种代理以控制对这个对象的访问

二:动态代理特点:

代理模式的核心作用就是通过代理,控制对对象的访问。它的设计思路是:定义一个抽象角色,让代理角色和真实角色分别去实现它。

真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。它只关注真正的业务逻辑,比如歌星唱歌。

代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并在前后可以附加自己的操作,比如谈合同,布置场地,收钱等等。

这就是代理模式的设计思路。代理模式分为静态代理和动态代理。静态代理是我们自己创建一个代理类,这个代理类要实现被代理类的通用接口,和策略模式很像,唯一不同的是策略模式的策略上下文角色不要求必须实现抽象策略接口。而动态代理是程序自动帮我们生成一个代理。

三:动态代理实现:

抽象角色:
public interface Subject{
	public void doSomething();
}
被代理角色(真实角色):
Public RealSubject implements Subject(){
@Override
public void doSomething(){
Syso(“实际要处理的核心业务逻辑”);
}
}
代理角色的handler:
Public class MyHandler implements InvocationHandler(){
private Object target;
	public MyHandler (Object target) {
		super();
		this.target = target;
	}
	@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		return method.invoke(target, args);
		}
动态代理类:
Public class DynamicProxy<T>{
Public static <T> T newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h){
//寻找AOP的切入点(通过@Pointcut表示)
If(true){
//寻找AOP的增强方式(@Before等5种方式),在指定的切入点执行特定范围的增强。这里示例一个前置增强
new BeforeAdvice().exec();
}
//这里相当于自定义一个动态代理类,实际的执行可以直接通过下面的return获取动态代理示例,在执行的过程会自动寻找配置的注解进行增强。
return (T)Proxy. newProxyInstance(loader, interfaces, h)
}
}
前置通知接口及其实现:
public interface IAdvice{
	public void exec();
}
Public BeforeAdvice implements IAdvice(){
@Override
public void exec()
{
Syso(“前置增强处理逻辑”);
}
}
测试类:public class Client {
	public static void main(String[] args) {
		Subject subject=new RealSubject ();//被代理类
MyHandler handler=new MyHandler (subject);//代理handler
Subject proxy =DynamicProxy.newProxyInstance(subject.getClass().getClasslo            ader(),subject.getClass().getInterfaces(),handler);
proxy.doSomething();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值