动态代理实现AOP弥补静态代理模拟AOP的缺点

文章讲述了静态代理在AOP中的局限性,即对Service接口多方法处理的不便。通过引入动态代理,如SpringCGLIB,实现在不修改Agent类的情况下扩展业务逻辑,符合开闭原则。作者展示了如何使用CGLIB创建代理对象并实现切面编程。
摘要由CSDN通过智能技术生成

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);
    }
}

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值