JAVA:使用 Spring AOP 实现面向切面编程

这篇具有很好参考价值的文章主要介绍了JAVA:使用 Spring AOP 实现面向切面编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、简述

在现代的软件开发中,面向切面编程(AOP)是一种重要的编程范式,它允许我们将横切关注点(如日志记录、性能监控、事务管理等)从应用程序的核心业务逻辑中分离出来,以提高代码的模块化和可维护性。Spring 框架提供了强大的 AOP 支持,使得我们可以轻松地实现面向切面编程。本文将介绍 Spring AOP 的基本概念、工作原理,并列举常见的应用场景样例。
JAVA:使用 Spring AOP 实现面向切面编程,JAVA,java,spring,servlet

2、工作原理

Spring AOP 基于代理模式实现,它使用代理对象包装目标对象,然后根据切点(pointcut)和通知(advice)来确定在何时、何地执行横切逻辑。以下是 Spring AOP 中的关键概念:

  • 切点(Pointcut):切点是一个表达式,它定义了在应用程序中哪些地方应该应用通知。通常使用 AspectJ 切点表达式来描述切点。

  • 通知(Advice):通知是在切点上执行的具体操作,它定义了在目标方法执行前、执行后或抛出异常时应该执行的逻辑。

  • 切面(Aspect):切面是通知和切点的结合,它是面向切面编程的核心单元。一个切面定义了何时、何地应用哪种通知。

  • 连接点(Join Point):连接点是在应用程序执行过程中能够应用通知的点,例如方法调用、方法执行、异常处理等。

  • 引入(Introduction):引入允许我们向现有的类添加新的方法和属性。

  • 目标对象(Target Object):目标对象是被代理的真实对象,它包含核心业务逻辑。

  • 代理对象(Proxy Object):代理对象是 Spring AOP 创建的对象,它包装了目标对象并应用了通知。

3、应用场景

Spring AOP(Aspect-Oriented Programming)是 Spring 框架的一个模块,它提供了一种将横切关注点(cross-cutting concerns)模块化的方式。横切关注点是那些影响应用程序的多个部分的功能,例如日志记录、事务管理等。AOP 的核心思想是通过在程序运行期间动态地将这些横切关注点与核心业务逻辑织入(weave)到一起,而不是在代码编写阶段硬编码它们。

3.1 日志记录

记录方法的入参、出参以及执行时间,以便进行系统运行状态监控和故障定位:

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logMethodCall(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("Calling method: " + methodName);
    }

    @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
    public void logMethodReturn(JoinPoint joinPoint, Object result) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("Method " + methodName + " returned: " + result);
    }
}
3.2 性能监控

记录方法的执行时间,分析系统性能瓶颈和优化空间:

@Aspect
@Component
public class PerformanceMonitoringAspect {

    @Around("execution(* com.example.service.*.*(..))")
    public Object monitorPerformance(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long endTime = System.currentTimeMillis();
        System.out.println("Method execution time: " + (endTime - startTime) + " ms");
        return result;
    }
}
3.3 事务管理

在方法执行前开启事务,在方法执行后根据执行结果决定提交或回滚事务:

@Aspect
@Component
public class TransactionAspect {

    @Autowired
    private PlatformTransactionManager transactionManager;

    @Around("@annotation(org.springframework.transaction.annotation.Transactional)")
    public Object manageTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
        TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
        try {
            Object result = joinPoint.proceed();
            transactionManager.commit(status);
            return result;
        } catch (Exception ex) {
            transactionManager.rollback(status);
            throw ex;
        }
    }
}
3.4 权限控制

根据用户权限控制方法的访问权限,防止未授权操作:

@Aspect
@Component
public class SecurityAspect {

    @Autowired
    private SecurityService securityService;

    @Before("@annotation(org.springframework.security.access.annotation.Secured) && execution(* com.example.controller.*.*(..))")
    public void checkPermission(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String[] rolesAllowed = signature.getMethod().getAnnotation(Secured.class).value();
        if (!securityService.hasPermission(rolesAllowed)) {
            throw new AccessDeniedException("Access Denied");
        }
    }
}

4、总结

Spring AOP 提供了一种优雅的方式来实现面向切面编程,它能够有效地解耦系统中的横切关注点和核心业务逻辑,提高了代码的可维护性和可重用性。本文介绍了 Spring AOP 的基本概念、工作原理,并列举了常见的应用场景样例,希望对读者理解和应用 Spring AOP 提供了帮助。文章来源地址https://www.toymoban.com/news/detail-849565.html

到了这里,关于JAVA:使用 Spring AOP 实现面向切面编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring AOP:面向切面编程

    在软件开发中,我们经常会遇到一些横切关注点(cross-cutting concerns),如日志记录、事务管理和安全性等。这些关注点不属于特定的模块或类,而是横跨整个应用程序。传统的面向对象编程方法往往会将这些关注点与核心业务逻辑混杂在一起,导致代码的可读性和可维护性下

    2024年02月09日
    浏览(47)
  • [SSM]Spring面向切面编程AOP

    目录 十五、面向切面编程AOP 15.1AOP介绍 15.2AOP的七大术语 15.3切点表达式 15.4使用Spring的AOP 15.4.1准备工作 15.4.2基于AspectJ的AOP注解式开发 15.4.3基于XML配置方式的AOP(了解) 15.5AOP的实际案例:事务处理 15.6AOP的实际案例:安全日志 IoC使软件组件松耦合。AOP让你能够捕捉系统中经

    2024年02月15日
    浏览(49)
  • Spring AOP(面向切面编程)和方法拦截

    Spring AOP(面向切面编程)和方法拦截 Spring是一款广泛使用的Java开发框架,提供了丰富的功能和工具,用于简化企业级应用程序的开发。其中一个重要的特性是面向切面编程(AOP)和方法拦截。本文将介绍Spring AOP和方法拦截的概念、工作原理以及在实际开发中的应用。 在软

    2024年02月05日
    浏览(46)
  • 认识 spring AOP (面向切面编程) - springboot

    本篇介绍什么是spring AOP, AOP的优点,使用场景,spring AOP的组成,简单实现AOP 并 了解它的通知;如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 AOP: 面向切面编程,也就是面向某一类编程,对某一类事情进行统一处理; spring AOP: 是实现了AOP这种思想的一

    2024年02月14日
    浏览(51)
  • 切面的魔力:解密Spring AOP 面向切面编程

    目录 一、AOP简介 1.1 什么是AOP ? 1.2 什么是面向切面编程 ? 1.3 AOP 的特点 二、 AOP的基本概念解读 2.1 AOP的基本概念 2.2 AOP 概念趣事解读 三、代码情景演示 3.1 编写目标对象(超级英雄们正常的行动) 3.2 编写通知类 3.2.1 前置通知 3.2.2 后置通知 3.2.3 异常通知 3.2.4 环绕通知

    2024年02月11日
    浏览(58)
  • spring6-AOP面向切面编程

    1、场景模拟 搭建子模块:spring6-aop 1.1、声明接口 声明计算器接口Calculator,包含加减乘除的抽象方法 1.2、创建实现类 1.3、创建带日志功能的实现类 1.4、提出问题 ①现有代码缺陷 针对带日志功能的实现类,我们发现有如下缺陷: 对核心业务功能有干扰,导致程序员在开发核

    2024年02月08日
    浏览(54)
  • 【Spring AOP】结合日志面向切面编程 两种写法

            这里需要提前了解什么是Spring的AOP(Aspect Oriented Programming)。是在OOP(面向对象)思想的一种拓展思想。 简单来说就是将某个代码块嵌入到其它的代码块中 。笔者先前学Spring也有学什么IoC啊AOP啊,但实际上没有用过、就那听过学过没啥用的。。没会儿就忘记了。

    2024年02月13日
    浏览(44)
  • Spring AOP (面向切面编程)原理与代理模式—实例演示

    Spring 中文文档 (springdoc.cn) Spring | Home 官网         Java是一个面向对象(OOP)的语言,但它有一些弊端。虽然使用OOP可以通过组合或继承的方式来实现代码的重用。但当我们需要为多个不具有继承关系的对象(一般指的是两个不同的类,它们之间没有继承自同一个父类或接

    2024年02月15日
    浏览(56)
  • Spring AOP:面向切面编程在实际项目中的应用

    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础

    2024年02月09日
    浏览(45)
  • 【Spring】一文带你吃透AOP面向切面编程技术(上篇)

    个人主页: 几分醉意的CSDN博客_传送门 什么是AOP? AOP(Aspect Orient Programming):面向切面编程 Aspect:表示切面,给业务方法增加的功能,叫做切面。切面一般都是非业务功能,而且切面功能一般都是可以复用的。例如日志功能,事务功能,权限检查,参数检查,统计信息等等

    2024年01月16日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包