首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Spring AOP】@Aspect结合案例详解(二): @Pointcut使用@within和within(已附源码)

【Spring AOP】@Aspect结合案例详解(二): @Pointcut使用@within和within(已附源码)

作者头像
天罡gg
发布于 2023-01-31 10:10:59
发布于 2023-01-31 10:10:59
1.3K00
代码可运行
举报
文章被收录于专栏:天罡gg天罡gg
运行总次数:0
代码可运行

前言

在微服务流行的当下,在使用Spring Cloud / Spring Boot框架开发中,AOP使用的非常广泛,尤其是@Aspect注解方式当属最流行的,不止功能强大,性能也很优秀,还很舒心!所以本系列就结合案例详细介绍@Aspect方式的切面的各种用法,力求覆盖日常开发中的各种场景。 本文主要介绍@Pointcut切点表达式@within和within 这两种切点指示符,结合案例,十分钟让你彻底搞懂!

  • @within匹配指定类注解, 上文的@annotation是匹配指定方法注解
  • within匹配指定类或包

上文回顾:【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解(已附源码)


@within

@within 匹配的是类上的注解,匹配后 类中实现的方法都会被Advice增强。还是结合打印日志案例实际演练一下基本用法。

完善打印日志案例

上文实现的打印日志使用 @annotation 方式,由于是匹配方法注解, 所以我们就需要在各个方法上定义,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class DemoService {
    @MethodLog
    public Integer divide(Integer a, Integer b) {
        System.out.printf("divide方法内打印: a=%d  b=%d 返回:%d %n", a, b, a / b);
        return a / b;
    }
    
    @MethodLog
    public Integer add(Integer a, Integer b) {
        System.out.printf("add方法内打印: a=%d  b=%d 返回:%d %n", a, b, a + b);
        return a + b;
    }
}

这样一来 ,当类中越来越多的方法需要打印日志时,就需要对每个方法加@MethodLog注解,所以我们做一下完善优化,替换成在 类上加注解,不管有多少方法我只需要在类上加一个 @ClassLog注解 即可,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
@ClassLog
public class DemoService {
    public Integer divide(Integer a, Integer b) {
        System.out.printf("divide方法内打印: a=%d  b=%d 返回:%d %n", a, b, a / b);
        return a / b;
    }
    
    public Integer add(Integer a, Integer b) {
        System.out.printf("add方法内打印: a=%d  b=%d 返回:%d %n", a, b, a + b);
        return a + b;
    }
}

业务逻辑代码无侵入,所以divideadd 方法 都不需要改变,只是将方法@MethodLog注解去掉,在增加@ClassLog注解,这里用到的 @ClassLog注解 代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassLog {

}

另外,切点 @Pointcut 我们修改成:使用@within方式,让切点匹配ClassLog注解,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Pointcut(value = "@within(com.tiangang.aop.ClassLog)")
public void pointCut() {

}

语法:@Pointcut(value = "@within(注解类名)")

和上文的@annotation语法如出一辙,完整的切面类LogAspec 代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
@Aspect
public class LogAspect {

    @Pointcut(value = "@within(com.tiangang.aop.ClassLog)")
    public void pointCut() {

    }

    @Before("pointCut()")
    public void before(JoinPoint joinPoint) throws NoSuchMethodException {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Class<?> clazz = joinPoint.getTarget().getClass();
        Method method = clazz.getMethod(signature.getName(), signature.getParameterTypes());
        System.out.printf("[前置通知]: [目标类]:%s , [方法]:%s , [入参值]:%s%n"
                , clazz.getName(), method.getName(), Arrays.toString(joinPoint.getArgs()));
    }

    @AfterReturning(value = "pointCut()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        Class<?> clazz = joinPoint.getTarget().getClass();
        System.out.printf("[返回通知]: [目标类]:%s , [方法]:%s , [返回值]:%s%n"
                , clazz.getName(), joinPoint.getSignature().getName(), result);
    }
}

Advice通知只保留了 @Before@AfterReturning ,用于记录 方法签名、入参和返回值

调用试试看:

[前置通知]: [目标类]:com.tiangang.service.DemoService , [方法]:divide , [入参值]:[10, 2] divide方法内打印: a=10 b=2 返回:5 [返回通知]: [目标类]:com.tiangang.service.DemoService , [方法]:divide , [返回值]:5

至此,基于类的打印日志就基本完善了,所有加了@ClassLog注解的类都会被Advice增加打印日志💪💪。

如果需要增加 自定义逻辑,可以在ClassLog注解增加变量,并在Advice实现逻辑

演示一下,加一个控制是否打印result的逻辑,先在ClassLog中加isLogResult() 变量, 默认true,控制是否打印结果,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassLog {
    boolean isLogResult() default true;
}

然后在@AfterReturning中,通过ClassLog annotation = clazz.getAnnotation(ClassLog.class);获取到ClassLog注解,这样就可以自由发挥了,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@AfterReturning(value = "pointCut()", returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result) {
    Class<?> clazz = joinPoint.getTarget().getClass();
    ClassLog annotation = clazz.getAnnotation(ClassLog.class);
    if (annotation != null && annotation.isLogResult()) {
        System.out.printf("[返回通知]: [目标类]:%s , [方法]:%s , [返回值]:%s%n"
                          , clazz.getName(), joinPoint.getSignature().getName(), result);
    }
}

对需要切面增强的类加 @ClassLog 注解

需要打印结果,配置成:@ClassLog(isLogResult = true)@ClassLog,因为写的默认default true

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ClassLog(isLogResult = true)
public class DemoService {
    
}

不需要打印结果,配置成:@ClassLog(isLogResult = false)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ClassLog(isLogResult = false)
public class DemoService {
    
}

@within深入说明

因为@ClassLog注解是加在类上,就会涉及到类继承,那么子类继承父类后,调用子类的方法是否会被 @within 匹配?

先说原则主要看调用子类方法时应该走父类方法还是子类方法,再看对应父类/子类上 是否有 被@within匹配的注解(这里是@ClassLog注解),有就是匹配,没有就是不匹配!

这些在写代码时就可以确定,也就是静态匹配。懂继承的话就非常好理解,没理解的可以看看以下的详细说明:

  • 父类加上@ClassLog注解,调用父类方法肯定匹配,子类的具体情况如下:

子类不加@ClassLog注解

子类加@ClassLog注解

调用子类的新增方法(父类没有)

不匹配

匹配

调用子类的@Override方法

不匹配

匹配

调用子类的未@Override方法

匹配(因为走的父类方法)

匹配

  • 父类不加@ClassLog注解,调用父类方法肯定不匹配,子类的具体情况如下:

子类加@ClassLog注解

调用子类的新增方法(父类没有)

匹配

调用子类的@Override方法

匹配

调用子类的未@Override方法

不匹配(因为走的父类方法,父类上没加@ClassLog注解)

看起来复杂,实际非常容易验证,新建一个子类DemoServiceExt继承DemoService

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class DemoServiceExt extends DemoService {

    // 子类重写的方法
    @Override
    public Integer divide(Integer a, Integer b) {
        System.out.printf("ext.divide方法内打印: a=%d  b=%d 返回:%d %n", a, b, Math.floorDiv(a, b));
        return Math.floorDiv(a, b);
    }
    // 子类新增的方法
    public Integer max(Integer a, Integer b) {
        System.out.printf("ext.max方法内打印: a=%d  b=%d 返回:%d %n", a, b, Math.max(a,b));
        return Math.max(a, b);
    }
}

DemoController中新增一个API分别来调2个父类方法3个子类方法,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@RequestMapping("/demo")
public class DemoController {

    @Autowired
    private DemoService demoService;
    @Autowired
    private DemoServiceExt demoServiceExt;

    // http://localhost:8080/demo/test?a=10&b=2
    @GetMapping("/test")
    public void combine(Integer a, Integer b) {
        demoService.divide(a, b);
        demoService.add(a, b);
        demoServiceExt.divide(a, b);
        demoServiceExt.add(a, b);
        demoServiceExt.max(a, b);
    }
}

下面输出:父类DemoService 加@ClassLog,子类DemoServiceExt 不加@ClassLog的情况:

  • demoService.divide 调父类方法 - 匹配 [前置通知]: [目标类]:com.tiangang.service.DemoService , [方法]:divide , [入参值]:[10, 2] divide方法内打印: a=10 b=2 返回:5 [返回通知]: [目标类]:com.tiangang.service.DemoService , [方法]:divide , [返回值]:5
  • demoService.add 调父类方法 - 匹配 [前置通知]: [目标类]:com.tiangang.service.DemoService , [方法]:add , [入参值]:[10, 2] add方法内打印: a=10 b=2 返回:12 [返回通知]: [目标类]:com.tiangang.service.DemoService , [方法]:add , [返回值]:12
  • demoServiceExt.divide 调子类方法 - 重写方法 - 不匹配(因为被子类重写,走的不是父类方法) ext.divide方法内打印: a=10 b=2 返回:5
  • demoServiceExt.add 调子类方法 - 未重写方法 - 匹配(因为子类未重写,走的还是父类方法) [前置通知]: [目标类]:com.tiangang.service.DemoServiceExt , [方法]:add , [入参值]:[10, 2] add方法内打印: a=10 b=2 返回:12 注意:这里由于DemoServiceExt上没有注解,所以没打出来result。
  • demoServiceExt.max 调子类方法 - 新增方法(父类没有) - 不匹配(因为是新增方法,走的不是父类方法) ext.max方法内打印: a=10 b=2 返回:10

下面输出:父类DemoService 不加@ClassLog,子类DemoServiceExt 加@ClassLog的情况:

  • demoService.divide 调父类方法 - 不匹配,因为没走子类方法 divide方法内打印: a=10 b=2 返回:5
  • demoService.add 调父类方法 - 不匹配,因为没走子类方法 add方法内打印: a=10 b=2 返回:12
  • demoServiceExt.divide 调子类方法 - 重写方法 - 匹配(因为方法被子类重写,走的是子类方法) [前置通知]: [目标类]:com.tiangang.service.DemoServiceExt , [方法]:divide , [入参值]:[10, 2] ext.divide方法内打印: a=10 b=2 返回:5 [返回通知]: [目标类]:com.tiangang.service.DemoServiceExt , [方法]:divide , [返回值]:5
  • demoServiceExt.add 调子类方法 - 未重写方法 - 不匹配(因为方法未被子类重写,走的不是子类方法) add方法内打印: a=10 b=2 返回:12
  • demoServiceExt.max 调子类方法 - 新增方法(父类没有) - 匹配(因为是子类新增方法,走的是子类方法) [前置通知]: [目标类]:com.tiangang.service.DemoServiceExt , [方法]:max , [入参值]:[10, 2] ext.max方法内打印: a=10 b=2 返回:10 [返回通知]: [目标类]:com.tiangang.service.DemoServiceExt , [方法]:max , [返回值]:10

另外还有一个点:如果期望匹配父类及其子类所有方法,除了对父类和子类都加ClassLog注解的方式外,还可以对ClassLog注解增加 @Inherited,这样父类加上ClassLog注解会被子类继承,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ClassLog {
    boolean isLogResult() default true;
}

对于@within,至此就说透了~~💪💪


within

within前面没有@,所以不是匹配注解,而是匹配 ,另外还可以匹配 ,咱们一个一个说。

匹配指定类

将切点表达式改为within的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Pointcut(value = "within(com.tiangang.service.DemoService)")
public void pointCut() {

}

语法:@Pointcut(value = "within(类全路径名)")

匹配原则(以下2个必须需要同时满足)

  • 必须1:调用的类 必须是within内指定的类
  • 必须2:调用的方法 必须走within内指定类的方法,如果走的是父类方法,即使满足必须1,也不会被匹配。

所以上面这个切点表达式,只有DemoService类的方法会被Advice增强,执行结果如下:

  • demoService.divide 调父类方法 - 匹配 [前置通知]: [目标类]:com.tiangang.service.DemoService , [方法]:divide , [入参值]:[10, 2] divide方法内打印: a=10 b=2 返回:5 [返回通知]: [目标类]:com.tiangang.service.DemoService , [方法]:divide , [返回值]:5
  • demoService.add 调父类方法 - 匹配 [前置通知]: [目标类]:com.tiangang.service.DemoService , [方法]:add , [入参值]:[10, 2] add方法内打印: a=10 b=2 返回:12 [返回通知]: [目标类]:com.tiangang.service.DemoService , [方法]:add , [返回值]:12
  • demoServiceExt.divide 调子类方法 - 重写方法 - 不匹配,因为 调用的类 不是DemoService ext.divide方法内打印: a=10 b=2 返回:5
  • demoServiceExt.add 调子类方法 - 未重写方法 - 不匹配,因为 调用的类 不是DemoService add方法内打印: a=10 b=2 返回:12
  • demoServiceExt.max 调子类方法 - 新增方法(父类没有) - 不匹配,因为 调用的类 不是DemoService ext.max方法内打印: a=10 b=2 返回:10

那么请思考,换成 @Pointcut(value = “within(com.tiangang.service.DemoServiceExt)”) 结果是?

答案:只有DemoServiceExt的重写方法和新增方法会被Advice增强,执行结果如下:

  • demoService.divide 调父类方法 - 不匹配,因为 调用的类 不是DemoServiceExt divide方法内打印: a=10 b=2 返回:5
  • demoService.add 调父类方法 - 不匹配,因为 调用的类 不是DemoServiceExt add方法内打印: a=10 b=2 返回:12
  • demoServiceExt.divide 调子类方法 - 重写方法 - 匹配 [前置通知]: [目标类]:com.tiangang.service.DemoServiceExt , [方法]:divide , [入参值]:[10, 2] ext.divide方法内打印: a=10 b=2 返回:5 [返回通知]: [目标类]:com.tiangang.service.DemoServiceExt , [方法]:divide , [返回值]:5
  • demoServiceExt.add 调子类方法 - 未重写方法 - 不匹配,因为走的还是父类方法 add方法内打印: a=10 b=2 返回:12
  • demoServiceExt.max 调子类方法 - 新增方法(父类没有) - 匹配 [前置通知]: [目标类]:com.tiangang.service.DemoServiceExt , [方法]:max , [入参值]:[10, 2] ext.max方法内打印: a=10 b=2 返回:10 [返回通知]: [目标类]:com.tiangang.service.DemoServiceExt , [方法]:max , [返回值]:10

另外还有一个点:如果期望匹配 父类及其子类所有方法,可以在父类后面加个+,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Pointcut(value = "within(com.tiangang.service.DemoService+)")
public void pointCut() {

}

这样,父类和子类的方法就会都被匹配了~~💪💪

匹配指定包(package)

使用.*匹配,但不匹配子包

如下代码代表:com.tiangang.service 包下面的所有类的方法都会被匹配,但不包括子包下面的类的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Pointcut(value = "within(com.tiangang.service.*)")
public void pointCut() {

}

使用..*匹配包及子包

如下代码代表:com.tiangang 包以及子包下面的所有类的方法都会被匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Pointcut(value = "within(com.tiangang..*)")
public void pointCut() {

}

源码下载

百看不如一练,下载源码实际运行一遍效果更佳! 源码零积分下载地址:https://download.csdn.net/download/scm_2008/87381444


总结

本文介绍了@Pointcut切点表达式中的@within、within这两种切点指示符的基本用法,并结合打印日志案例从匹配 类(Class) 级别和匹配 包(package) 级别,并在有子类继承的场景下,对各种情况做了详细说明。

  • @within匹配指定 (Class) 注解
  • within前面没有@,所以不是匹配注解,而是匹配指定(package)


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
强悍的Spring之AOP使用
Spring中使用注解方式实现AOP,采用@AspectJ方式实现,首先确定需要切入的方法,也就是连接点
你呀不牛
2021/05/28
6430
Spring源码解析(九):AOP源码之@Aspect所有相关注解解析
InstantiationModelAwarePointcutAdvisorImpl构造函数 创建具体通知
Java微观世界
2025/01/21
4250
Spring源码解析(九):AOP源码之@Aspect所有相关注解解析
spring aop聊点不一样的东西
你有几年没回老家了? 我有三年。 今年怕是又回不去了,有些想家了。。。 你呢? 前言 前几篇文章本打算写spring aop的,但是强忍着没有写(旁白:也有可能是没想好该怎么写?),就是为了今天整个专
苏三说技术
2021/02/05
5560
【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解
在微服务流行的当下,在使用SpringCloud/Springboot框架开发中,AOP使用的非常广泛,尤其是@Aspect注解方式当属最流行的,不止功能强大,性能也很优秀,还很舒心!所以本系列就结合案例详细介绍@Aspect方式的切面的各种用法,力求覆盖日常开发中的各种场景。本文带来的案例是:打印Log,主要介绍@Pointcut切点表达式的@annotation方式,以及 五种通知Advice注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around。
天罡gg
2023/01/08
9.2K0
【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解
Spring读源码系列之AOP--09---aop源码流程一把拿下
上一篇文章已经详细介绍了两种aop自动代理创建器的导入流程分析,此时我们已经知道了自动代理创建器注册到容器中的流程,下面我们来探究一下,自动代理创建器对具体bean创建代理的流程,这里测试环境还是用上一篇中开头给出的测试环境。
大忽悠爱学习
2022/05/10
2730
Spring读源码系列之AOP--09---aop源码流程一把拿下
Spring学习总结(三)——Spring实现AOP的多种方式
AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的横向多模块统一控制的一种技术。AOP是OOP的补充,是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP可以分为静态织入与动态织入,静态织入即在编译前将需织入内容写入目标模块中,这样成本非常高。动态织入则不需要改变目标模块。Spring框架实现了AOP,使用注解配置完成AOP比使用XML配置要更加方便与直观。上一篇随笔中已经详细讲了代理模式。
张果
2022/05/09
4830
Spring学习总结(三)——Spring实现AOP的多种方式
Spring AOP 功能使用详解
AOP 既熟悉又陌生,了解过 Spring 人的都知道 AOP 的概念,即面向切面编程,可以用来管理一些和主业务无关的周边业务,如日志记录,事务管理等;陌生是因为在工作中基本没有使用过,AOP 的相关概念也是云里雾里;最近在看 Spring 的相关源码,所以还是先来捋一捋 Spring 中 AOP 的一个用法。
Java技术编程
2020/05/21
1.4K0
Spring AOP使用
AOP全程是Aspect—Oriented—Programming,面向切面编程。AOP采用横向抽取机制,将分散在各个方法中的重复代码抽取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。
ha_lydms
2023/08/09
2150
Spring AOP使用
[Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言:  在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习. 一, AspectJ的概述: AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。 Spring为了简化自身的AOP的开发,将AspectJ拿过来作为Spring自身一个AOP的开发. 二,
一枝花算不算浪漫
2018/05/18
6720
【小家Spring】Spring AOP核心类Pointcut解析,对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例)
首先需要说明一点:Pointcut接口有两个。 一个是:org.aspectj.lang.reflect.Pointcut,它是aspectj内部使用的。它只有一个实现类PointcutImpl。是它内部的抽象 另一个是:org.springframework.aop.Pointcut,这是Spring AOP体系中对切点的顶层抽象,贯穿整个AOP过程,非常重要。因此本文主要基于它,介绍一些原理以及它常用子类的一些使用。
YourBatman
2019/09/03
4.5K1
【小家Spring】Spring AOP核心类Pointcut解析,对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例)
一文搞懂Spring-AOP原理
文章目录 1. 简介 2. 添加依赖 3. 通知 4. 连接点 5. 切点 6. 切面 7. 实现 8. 注解的实现 9. 切入点表达式 10. 切面执行顺序(Order) 10.1. 注意点 11. Aspect实例化模型 12. 获取参数(args) 13. PointCut 14. PointCuts 15. ClassFilter 16. ClassFilters 17. MethodMatcher 18. MethodMatchers 19. Advice 20. Advisor 20.1.
爱撒谎的男孩
2019/12/31
1.1K0
Spring AOP 实践指南
Spring AOP(面向切面编程)是Spring框架的一个关键特性之一。它提供了一种在应用程序中实现横切关注点的方法,这些关注点通常会散布在应用程序的多个模块中,并且与核心业务逻辑存在交叉。
訾博ZiBo
2025/01/06
1940
Spring AOP 实践指南
【小家Spring】Spring AOP中@Pointcut切入点表达式最全面使用介绍
标准的AspectJ Aop的pointcut的表达式类型是很丰富的,但是Spring Aop只支持其中的9种,外加Spring Aop自己扩充的一种一共是11(10+1)种类型的表达式,分别如下。
YourBatman
2019/09/03
25.7K0
Spring读源码系列之AOP--01---aop基本概念扫盲---上
ExpressionPointcut,它是用于解析String类型的切点表达式的接口,这个很重要,一会重点分析。
大忽悠爱学习
2022/05/10
8790
Spring读源码系列之AOP--01---aop基本概念扫盲---上
_Spring AOP简介及相关案例
OK,确实是打印了发送邮件,因此该多切面配置成功,下面接着讲解用另外几种方法实现AOP ,让我们一起学习啪
会洗碗的CV工程师
2023/11/19
1710
_Spring AOP简介及相关案例
轻松上手Spring AOP,掌握切面编程的核心技巧
Spring框架是我们使用比较多的一个框架,而AOP又是Spring的核心特性之一,本篇文章将介绍一下AOP的切点表达式、通知等特性及如何使用Spring AOP。
索码理
2024/04/15
3570
轻松上手Spring AOP,掌握切面编程的核心技巧
Spring AOP使用入门案例
首先从start.spring.io上下载一个Spring Boot工程,只需要引入web依赖即可。然后我们创建一个Controller:
conanma
2021/10/28
7650
Spring-AOP
AOP引介 AOP(Aspect Oriented Programing)面向切面编程采用横向抽取机制,以取代传统的纵向继承体系的重复性代码(如性能监控/事务管理/安全检查/缓存实现等). 横向抽取代码复用: 基于代理技术,在不修改原来代码的前提下,对原有方法进行增强. Spring AOP 历史 1.2开始, Spring开始支持AOP技术(Spring AOP) Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码. 2.0之后, 为了简化A
Java帮帮
2018/03/16
1.2K1
Spring AOP
Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的技术。它通过将横切关注点(例如日志记录、事务管理、安全性检查等)从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用。
长乐坡头
2024/01/10
2020
Spring AOP简介及相关案例
会洗碗的CV工程师
2023/10/14
2360
Spring AOP简介及相关案例
相关推荐
强悍的Spring之AOP使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档