1.概述
在静态代理模拟aop中,Agent类中写死了buy()方法,当Service接口中有多个方法时,那么想要实现多个方法的业务逻辑,那么此时Agent类中就要频繁的进行修改,此时不满足开闭原则,动态代理很好的解决了这个问题。
2.前提
前提需要了解什么是静态代理和动态代理。
3. 代码实现
3.1 项目结构和改写
项目结构:去掉了静态模拟aop中的Agent类。
在Service接口中新增show方法,show方法中用了default 关键字修饰是为了让实现类可以有选择的进行重写。
BookServiceImpl重写show方法。
增加ProxyFactory类
package cn.itxiaoli;
import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;
import java.lang.reflect.Method;
/**
* @author itxiaoli
* @className ProxyFactory
* @description:
* @date 2022/4/14 11:40
*/
public class ProxyFactory {
public static Object getProxyObject(Service target, Aop aop) {
// target 对象的类加载器
ClassLoader classLoader = target.getClass().getClassLoader();
// target 对象要实现的所有接口
Class<?>[] interfaces = target.getClass().getInterfaces();
return Proxy.newProxyInstance(
classLoader,
interfaces,
// 匿名内部类 代理对象的功能实现
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
// 切面
try {
aop.before();
// 业务
obj = method.invoke(target, args);
// 切面
aop.after();
} catch (Exception e) {
// 切面
aop.exception();
e.printStackTrace();
}
return obj;
}
});
}
}
测试类
public class ProxyTest {
@Test
public void getProxyTest() {
Service proxyObject = (Service) ProxyFactory.getProxyObject(new BookServiceImpl(), new TransactionAop());
proxyObject.buy();
// 显示图书价格
String show = proxyObject.show(100);
System.out.println(show);
}
}
效果: