Spring AOP理解

前言

从开始接触Spring就知道它的两大特性IOC(控制反转)和AOP(面向切面编程),当时只是死记硬背,并不太理解这些是如何做到的,
最近重新看Spring的知识点,发现对AOP有了更深刻的理解,明白了为什么要这样做,是怎么样做到AOP的。特地记录下自己的理解。

为什么要面向切面编程
举个日常开发中最常见的列子,操作日志入库,最原始的方式,在每次操作结束的时候额外执行一个插入日志的函数。
当函数很多的时候这种方式就显的很笨重了。面向切面编程AOP就提供了更为优雅的方式。
我们可以理解为在函数运行的时候切开一个面,在所有函要结束的时候插入一段保存日志的逻辑。
好处:解耦合、方便
Spring是如何实现这种功能的
这里用到了动态代理,默认情况下接口使用JDKProxy,其他使用Cglib。

JDK 动态代理:
主要涉及到 java.lang.reflect 包中的两个类:Proxy 和 InvocationHandler。
InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,
动态将横切逻辑和业务逻辑编制在一起。Proxy 利用 InvocationHandler 动态创建 一个符合某一接口的实例,生成目标类的代理对象。

Cglib动态代理:
CGLib 全称为 Code Generation Library,是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展 Java 类与实现 Java 接口,
CGLib 封装了 asm,可以再运行期动态生成新的 class。

JDK 创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过 CGLib 创建动态代理。
AOP的核心概念
aspect 切面:类是对物体对象的抽象,切面就是对横切关注点的抽象
joinPoint 连接点:被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
pointCut 切点:对连接点进行拦截的定义
weave 织入:将切面应用到目标对象,并使代理对象创建的过程。
advice 通知:可以理解为运行到连接点的时候要运行的代码,分为五类:
@Before @AfterReturning方法正常返回时 @AfterThrowing 抛出异常时 @After 方法运行结束 @Around 环绕整个方法

自己学习的测试代码

package com.wslin.aop.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TestAspect {

    @Pointcut("@annotation(com.wslin.aop.annotation.MyTest)")
    void printPointCut(){}

    @Before("printPointCut()")
    void print(){
        System.out.println("111");
    }

    @Around("printPointCut()")
    void aroundPrint(ProceedingJoinPoint proceedingJoinPoint)throws Throwable{
        Object target = proceedingJoinPoint.getTarget();
        Object old = proceedingJoinPoint.getThis();
        String name = proceedingJoinPoint.getSignature().getName();
        System.out.println(target.getClass().toString());
        System.out.println(old);
        System.out.println(name);
        Object[] args = proceedingJoinPoint.getArgs();
        for(Object obj: args){
            if(obj instanceof String){
                System.out.println((String)obj);
            }
        }
        proceedingJoinPoint.proceed();

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值