代理模式简单理解就是在不改变原业务代码的基础上做增强功能。
模拟使用场景:假如别人写了一个支付的功能,现在领导要我在支付前加一个安全检查的功能,并且在支付后发送短信。而别人写的支付功能完好,我不想改里面的任何东西。咋搞。这就可以用到代理模式了。
假如说这就是别人的支付代码
package com.px.eleven.system.service;
import cn.hutool.core.lang.Console;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@Service
public class PayServiceImpl implements IPayService {
@Override
public boolean pay(String account, BigDecimal amount) {
Console.log("向"+account+"账号汇款"+amount+"元");
return true;
}
}
我要做的就是创建一个代理类,内容如下:
package com.px.eleven.system.listen;
import cn.hutool.core.lang.Console;
import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
@Component
public class PayProxy {
public Object createProxy(Object proxiedObject) {
DynamicProxyHandler handler = new DynamicProxyHandler(proxiedObject);
Class<?>[] interfaces = proxiedObject.getClass().getInterfaces();
return Proxy.newProxyInstance(proxiedObject.getClass().getClassLoader(), interfaces, handler);
}
private class DynamicProxyHandler implements InvocationHandler {
private Object proxiedObject;
public DynamicProxyHandler(Object proxiedObject) {
this.proxiedObject = proxiedObject;
}
public void before(){
Console.log("进入支付前 安全检查,账户校验中");
}
public void after(){
Console.log("发送短息");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(proxiedObject, args);
after();
return result;
}
}
}
调用方式:
package com.px.eleven;
import com.px.eleven.system.listen.PayProxy;
import com.px.eleven.system.service.IPayService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.junit.runner.RunWith;
import java.math.BigDecimal;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ElevenApplicationTests {
@Autowired
private IPayService payService;
@Test
public void testObEvent() {
PayProxy payProxy =new PayProxy();
IPayService proxy = (IPayService) payProxy.createProxy(payService);
proxy.pay("6227XXXXXXXXXXXXX", BigDecimal.valueOf(500));
}
}
这样就可以在原支付功能的基础上增加一些额外的功能了。不过现在这些功能都可以直接使用spring的aop功能实现了