AOP原理与代理模式

本文介绍了AOP(面向切面编程)的基本概念,包括切面、连接点、通知、切入点等核心组成部分,并阐述了AOP的实现原理,通过静态代理和动态代理的示例进行说明。此外,还探讨了AOP在权限控制、缓存、错误处理等方面的典型应用。
摘要由CSDN通过智能技术生成

概念: AOP(Aspect Orlent Programming),面向切面编程,是OOP面向对象编程的一种补充。在运行时,将代码动态地切入到类的指定方法、指定位置上,使业务代码和非业务代码分离的编程思想就是面向切面的编程思想。

aop各个组成部分:

  • AOP中的重要组成::通常是一个类,里面可以定义切入点和通知
  • 切面(Aspect)
  • 连接点(Joinpoint): 可以被切入的点,通常是方法。连接点对象描述了当前连接点的信息,比如,目标对象、方法信息、参数等等
  • 通知(Advice): 需要向切面加入的功能,加入位置有:before,after,afterReturning,afterThrowing,around
  • 切入点(Pointcut): 需要织入通知的连接点,通常用SPEL描述
  • 引入(Introduction):对目标对象添加方法和属性
  • 目标对象(Target Object):织入 Advice 的目标对象.,切面通知的对象
  • AOP 代理(AOP Proxy): AOP的一种实现方式
  • 织入(Weaving):需要织入通知的连接点,通常用SPEL描述

AOP实现原理:

AOP实现是用动态代理实现的

我们来看看动态代理和静态代理的简单写法:

静态代理: 代理类的相关方法直接在代码中写死。
**例子:**一个接口有两个实现类,一个实现类实现了接口中具体的方法,另一个代理类持有实现类的对象,然后通过代理类可以为实现类新增功能或调用方法,比如spring中的AOP就是代理模式实现的。

接口:

//接口
public interface KillServicepublic String killOne(int money);

实现类:

public class KillServiceImpl implements KillService{
    public String KillOne(int money){
        return money+"元买东西";
    }
}

代理类

public class KillServiceProxy implements KillService{
    private KillServiceImpl ksi=new KillServiceImpl(); //持有被代理者的对象
    public String KillOne(int money){
        String result=ksi.KillOne(50000);
        return result;
    }
}

测试类:

public class ProxyApp {
    public static void main(String[] args) {
        //静态代理
        KillService kps=new KillServiceProxy();
        ksp.killOne(50000);
    }

**动态代理:**动态代理原理和静态代理一样,但是他没有具体的代理类,通过你指定一个类他给你变成某类的代理类。

public class DynamicProxy implements InvocationHandler {
    private Object target; //要被代理的实例

    public Object getProxy(Object target) {
        this.target=target;
        //创建Proxy类动态代理实例
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    //方法拦截加入代理功能
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(method.getName() + "执行,参数为"+ Arrays.toString(args));
        long before = System.currentTimeMillis();
        Object result = method.invoke(target, args);
        long after = System.currentTimeMillis();
        System.out.println(method.getName() + "执行,耗时"+(after-before)+"毫秒");
        return result;
    }
}

AOP使用场景:

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging  调试

logging, tracing, profiling and monitoring 记录跟踪 优化 校准

Performance optimization 性能优化

Persistence  持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值