AOP动态代理

AOP(面向切面编程)是OOP的延伸,用于降低代码耦合度和提高可重用性。本文通过实例解释了如何使用动态代理在Java中实现AOP,展示了如何在不修改原有业务逻辑的情况下,添加如性能监控等功能。动态代理通过InvocationHandler实现,允许在方法调用前后插入额外操作。示例中,动态代理实现了UserService接口,并在调用getUserList()时记录了执行时间。AOP常用于日志记录、事务管理、性能优化等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AOP动态代理技术## 标题
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
与OOP不同,AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

代理
代理,顾名思义,让别人代自己做。生活中我们经常接触的类似的事就是网购,正常来说我们买东西都要到店里挑选付钱然后到手,现在我们可以通过网购,让卖家用快递代我们取商品送在自己手中。
AOP动态代理也一样,在别的类中代理实现

首先编写一个接口

public interface UserService {
    void login();
    void logout();
    @Perfomance
    void getUserList();
}

然后再编写实现类实现接口

public class UserServerimpl implements UserService {
    @Override
    public void login() {
        System.out.println(1);
    }

    @Override
    public void logout() {
        System.out.println(2);
    }

    @Override
    public void getUserList() {
        System.out.println(3);
    }
}

再写一个动态代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
public class DyProxy {
    //动态代理技术
    private  Object toProxyObj;
    public Object getProxyObject(Object object){
        this.toProxyObj = object;       // 目标类的类加载器                     // 目标类的接口列表
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),
                // 代理要执行的操作
                new InvocationHandler() {
                // 参数的含义:生成的代理对象、目标方法、方法参数
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    Object result;
                    if (method.isAnnotationPresent(Perfomance.class)){
                        long startTime = new Date().getTime();
                       result = method.invoke(toProxyObj,args);
                        long endTime = new Date().getTime();
                        long totalTime = endTime - startTime;
                        System.out.println("函数执行了"+totalTime+"ms");
                    }else {
                        result = method.invoke(toProxyObj,args);
                    }
                    return result;
                }
        });
    }
}

最后测试

public class TestAOP {

    public static void main(String[] args) {
        //AOP的面向对象切面编程,测试性能  统一日志   管理事务
        UserService us = (UserService) new DyProxy().getProxyObject(new UserServerimpl());
        us.getUserList();
        us.login();
        us.logout();
    }

结果:
3
函数执行了1ms
1
2

AOP主要利用反射解决OOP的代码纠缠问题,同时他也用更抽象的概念去编写程序,他更注重一些程序发横切性行为,例如:
日志记录,跟踪,优化和监控
事务的处理
持久化
性能的优化
资源池,如数据库连接池的管理
系统统一的认证、权限管理等
应用系统的异常捕捉及处理
针对具体行业应用的横切行为
前面几种横切行为都已经得到了密切的关注,也出现了各种有价值的应用,但也许今后几年,AOP 对针对具体行业应用的贡献会成为令人关注的焦点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值