Spring系列【AOP编程】

简介: Spring系列【AOP编程】

文章目录


写在前面 🚀


提出问题 🤪


面向切面编程AOP 🎄


AOP术语 🍭


通知类型 🍹


AOP 的类型 😮


AOP 的优势 🐱‍🐉


第一个AOP程序开发


1.引入相关依赖


2.开发通知类


3.Spring.xml中注册通知


4.配置切面 通知 + 切入点


5.测试


6.结果


写在前面 🚀


前面学习了Spring的 IOC 及 DI 后,Spring还提供了对 AOP 的支持,AOP译为“面向切面编程”,和 OOP(面向对象编程)类似,它也是一种编程思想。AOP的本质也是解耦合,学习它🤪


提出问题 🤪



在实际开发中,处理业务开发,还有一些例日志管理,权限管理,事务控制,异常处理等的处理,这些功能虽然与应用的业务无关,但几乎所有的业务模块都会使用到他们,因此每个业务模块都要嵌入这些代码,这样就会产生大量重复的冗余代码,不利于各个模块的复用,你可能想过使用封装方法,在业务模块中调用的解决方案,确实可以,但是这种解决方案在一定的程度上减少了代码的冗余程度,但是这种做法也增加了业务模块和公用函数的耦合性,这种耦合性过高的解决方案是不推荐的。🥺


面向切面编程AOP 🎄


与 OOP 中纵向的父子继承关系不同,AOP 是通过横向的抽取机制实现的。它将应用中的一些非业务的通用功能抽取出来单独维护,并通过声明的方式(例如配置文件、注解等)定义这些功能要以何种方式作用在哪个应用中,而不是在业务模块的代码中直接调用。


OOP是纵向解决代码的冗余问题,它关注类和方法层的设计


AOP是横向解决代码的冗余问题,取代了传统继承体系重复代码的,例如性能分析,事务控制,等等……,实现业务逻辑和附加操作的代码解耦


目前最流行的 AOP 实现(框架)主要有两个,分别为 Spring AOP 和 AspectJ。


6defa8872ecb4d28a165f58fa80289c7.png


AOP术语 🍭



62fe1106c96545e8b093a0e0922ad8fa.png


通知类型 🍹


5dcf43c68d674211a632ff19ba4caedf.png


AOP 的类型 😮


AOP 可以被分为以下 2 个不同的类型。动态AOP和静态AOP


动态 AOP 的织入过程是在运行时动态执行的。其中最具代表性的动态 AOP 实现就是 Spring AOP,它会为所有被通知的对象创建代理对象,并通过代理对象对被原对象进行增强。相较于静态 AOP 而言,动态 AOP 的性能通常较差,但随着技术的不断发展,它的性能也在不断的稳步提升。动态 AOP 的优点是它可以轻松地对应用程序的所有切面进行修改,而无须对主程序代码进行重新编译。


静态 AOP 是通过修改应用程序的实际 Java 字节码,根据需要修改和扩展程序代码来实现织入过程的。最具代表性的静态 AOP 实现是 AspectJ。相较于动态 AOP 来说,性能较好。但它也有一个明显的缺点,那就是对切面的任何修改都需要重新编译整个应用程序。



AOP 的优势 🐱‍🐉


AOP 是 Spring 的核心之一,在 Spring 中经常会使用 AOP 来简化编程。


在 Spring 框架中使用 AOP 主要有以下优势。


提供声明式企业服务,特别是作为 EJB 声明式服务的替代品,最重要的是,这种服务是声明式事务管理。

允许用户实现自定义切面。在某些不适合用 OOP 编程的场景中,采用 AOP 来补充。

可以对业务逻辑的各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时也提高了开发效率。


Spring AOP 是 Spring 框架的核心模块之一,它使用纯 Java 实现,因此不需要专门的编译过程和类加载器,可以在程序运行期通过代理方式向目标类织入增强代码。


第一个AOP程序开发


1.引入相关依赖


<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>


2.开发通知类


● MethodBeforeAdvice 前置通知

● MethodInterceptor 环绕通知

● AfterReturningAdvice 返回后通知

● ThrowsAdvice 异常通知


//自定义记录方法名称的前置通知 前置通知:目标方法执行之前先执行的额外操作


public class MyBeforeAdvice implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("当前执行的方法是:" + method.getName());
        System.out.println("当前执行的方法参数:" + args[0]);
        System.out.println("目标对象:" + target);
    }
}


3.Spring.xml中注册通知


<!--MyBeforeAdvice Bean-->
<bean id="myBeforeAdvice" class="vip.zhouql.advice.MyBeforeAdvice"/>


4.配置切面 通知 + 切入点


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--MyBeforeAdvice Bean-->
    <bean id="myBeforeAdvice" class="vip.zhouql.advice.MyBeforeAdvice"/>
    <!--组装切面-->
    <aop:config>
        <!--
        配置切入点
        id:    切入点在工厂中的唯一标识
        expression: 用来指定切入项目哪些组件中的哪些方法
        -->
        <aop:pointcut id="pc" expression="execution(* vip.zhouql.service.impl.UserServiceImpl.*(..))"/>
        <!--
        配置切面
        advice-ref:工厂中通知id
        pointcut-ref:工厂切入点唯一标识
        -->
        <aop:advisor advice-ref="myBeforeAdvice" pointcut-ref="pc"/>
    </aop:config>
</beans>


5.测试


public class TestSpring {
    public static void main(String[] args) {
        String springName = "spring.xml";
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(springName);
        UserService userService = (UserService) context.getBean("userService");
        userService.save();
        userService.delete();
    }
}


6.结果


可以看到在方法执行前,通过spring aop 实现了前置通知,OK,Perfect 🚀


当前执行的方法是:save
目标对象:vip.zhouql.service.impl.UserServiceImpl@180cb77
调用DAO,完成添加
当前执行的方法是:delete
目标对象:vip.zhouql.service.impl.UserServiceImpl@180cb77
调用DAO,完成删除


相关文章
|
20天前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
253 0
|
1月前
|
Java API 开发者
Spring 控制反转与依赖注入:从玄学编程到科学管理
在传统开发中,手动`new`对象导致紧耦合、难以维护和测试。控制反转(IoC)将对象创建交给框架,实现解耦。Spring通过IOC容器自动管理对象生命周期,开发者只需声明依赖,无需关心创建细节。依赖注入(DI)是IoC的具体实现方式,支持构造器、Setter和字段注入。构造器注入推荐使用,保证依赖不可变且易于测试。对于多个同类型Bean,可用`@Qualifier`或`@Primary`解决冲突。此外,Spring还支持依赖查找(DL),开发者主动从容器获取Bean,适用于动态场景,但侵入性强。掌握IoC与DI,有助于构建灵活、可维护的Spring应用。
|
4月前
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
|
1月前
|
人工智能 监控 安全
Spring AOP切面编程颠覆传统!3大核心注解+5种通知类型,让业务代码纯净如初
本文介绍了AOP(面向切面编程)的基本概念、优势及其在Spring Boot中的使用。AOP作为OOP的补充,通过将横切关注点(如日志、安全、事务等)与业务逻辑分离,实现代码解耦,提升模块化程度、可维护性和灵活性。文章详细讲解了Spring AOP的核心概念,包括切面、切点、通知等,并提供了在Spring Boot中实现AOP的具体步骤和代码示例。此外,还列举了AOP在日志记录、性能监控、事务管理和安全控制等场景中的实际应用。通过本文,开发者可以快速掌握AOP编程思想及其实践技巧。
|
1月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
1月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
5月前
|
人工智能 监控 Java
面向切面编程(AOP)介绍--这是我见过最易理解的文章
这是我见过的最容易理解的文章,由浅入深介绍AOP面向切面编程,用科普版和专家版分别解说,有概念,有代码,有总结。
|
6月前
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
753 0
|
6月前
|
Java 开发者 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——什么是AOP
本文介绍了Spring Boot中的切面AOP处理。AOP(Aspect Oriented Programming)即面向切面编程,其核心思想是分离关注点。通过AOP,程序可以将与业务逻辑无关的代码(如日志记录、事务管理等)从主要逻辑中抽离,交由专门的“仆人”处理,从而让开发者专注于核心任务。这种机制实现了模块间的灵活组合,使程序结构更加可配置、可扩展。文中以生活化比喻生动阐释了AOP的工作原理及其优势。
355 0