Spring AOP理解及原理(学习笔记2)

以下内容为个人学习笔记(多引荐自别人优秀见解和内容,同时结合自己的理解)

1.什么是aop

aop(Aspect Oriented Programming)即面向切面编程,面向切面编程是面向对象编程的一种延续或补充。一般程序设计过程中,编写的代码都是从上至下的顺序执行,也就是面对对象只允许你定义从上到下的关系,这就导致了很多代码的重复,例如事务管理、日志功能都是在业务代码上多出来的于业务无关的功能代码。而aop通过“切面”编程的方式,将重复的代码封装起来,在需要的时候再“切入”执行。

正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”

2.spring AOP原理

aop的原理是动态代理。主要有两种实现方式,第一种是当代理类有实现接口时,使用jdk动态代理实现;第二种是当代理类没有实现类时使用CGLIB(Code Generation Library)实现。

第一种 jdk动态代理实现

要了解这种实现方式可以先去了解jdk动态代理https://blog.csdn.net/jiankunking/article/details/52143504

jdk动态代理实现主要是去创建接口实现类的代理对象,在代理对象中增强类的方法。

jdk动态代理实现AOP的基本过程:

  • 创建接口及接口实现类
public interface User {
    
    String getUserName(String id);
    boolean addUser(String id);
}
public class UserImpl implements User {
    @Override
    public String getUserName(String id) {
        return "返回username";
    }

    @Override
    public boolean addUser(String id) {
        return false;
    }
}
  • 调用jdk中java.lang.reflect包下的动态代理类proxy,该类提供了newProxyInstance方法实现生成接口的代理对象

  • 编写接口代理对象,实现实现类的增强逻辑
public class UserProxy {
    public static void main(String[] args) {

        Class[] interfaces = {User.class};

        // 创建接口实现类实例传递给InvocationHandler实现类实现"切面"
        UserImpl user = new UserImpl();

        // 创建接口实现接口实现类的代理对象,使用proxy中的newInstanceProxy方法
        Proxy.newProxyInstance(UserProxy.class.getClassLoader(),interfaces, new UserInvocationHandler(user));

    }


}
  • 编写invocationHandler实现类,实现增强逻辑

// 继承InvocationHandler,重写invoke方法,编写接口实现类增强逻辑
public class UserInvocationHandler implements InvocationHandler {
    // 被代理接口实现类proxyObject
    private Object proxyObject;

    // 第一步,通过构造函数获取被代理接口实现类
    public UserInvocationHandler(Object proxyObject){
        this.proxyObject = proxyObject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        // 前置执行(在方法执行之前)
        System.out.println("方法执行之前执行该逻辑:"+method.getName()+"该方法的参数"+ Arrays.toString(args));

        // 被增强的方法执行
        method.invoke(proxyObject,args);

        // 后置执行
        System.out.println("方法执行之后执行该逻辑:"+proxyObject);

        return null;
    }
}

第二种 使用CGLIB(Code Generation Library)实现(后面补)

详情可以参考别人的优秀博文https://blog.csdn.net/qq_33661044/article/details/79767596

3.spring AOP源码略析(后面补)

详情可以参考别人的优秀博文https://blog.csdn.net/forezp/article/details/84927180

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值