【Spring】核心部分之AOP:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心AOP,AOP有这一篇足以

简介: 【Spring】核心部分之AOP:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心AOP,AOP有这一篇足以

@TOC

基本概念

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

基本原理

用到了代理模式,有关代理模式见文章:设计模式——代理模式详解(Java版)

专业术语

连接点:可以被增强的方法
切入点:实际被增强的方法
通知(增强):实际增强的部分
通知有多种类型
前置通知
后置通知
环绕通知
异常通知
最终通知
切面:是一个动作,将通知应用到切入点的过程

案例演示

基于注解(重点)

1.需要增强的方法

public class User {
    public void Add(){
        System.out.println("add............");
    }
}

2,编写增强类

public class UserProxy {
    //前置通知
    public void before(){
        System.out.println("before...........");
    }
}

3.进行通知的配置

第一步:在spring的配置文件中开启注解扫描

xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
<!--开启注解扫描 -->
    <context:component-scan base-package="com.li.spring"></context:component-scan>

第二步:使用注解创建两个类的对象

@Component
public class User {
    public void Add(){
        System.out.println("add............");
    }
}
@Component
public class UserProxy {
    //前置通知
    public void before(){
        System.out.println("before...........");
    }
}

第三步:在增强的类上面加注解Aspect

@Aspect //生成代理对象
@Component
public class UserProxy {
    //前置通知
    public void before(){
        System.out.println("before...........");
    }
}

第四步:在spring的配置文件中开启Aspect生成代理对象

 xmlns:aop="http://www.springframework.org/schema/aop"
 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
  <!--开启aspect生成代理对象 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

4.配置不同类型的通知

@Component
@Aspect //生成代理对象
public class UserProxy {
    //前置通知
    @Before(value = "execution(* com.li.spring.User.Add(..))")
    public void before(){
        System.out.println("before...........");
    }
    //后置通知
    @After(value = "execution(* com.li.spring.User.Add(..))")
    public void after(){
        System.out.println("after...........");
    }
    @AfterReturning(value = "execution(* com.li.spring.User.Add(..))")
    public void AfterReturning(){
        System.out.println("AfterReturning...........");
    }
    @AfterThrowing(value = "execution(* com.li.spring.User.Add(..))")
    public void AfterThrowing(){
        System.out.println("AfterThrowing...........");
    }
    //环绕通知
    @Around(value = "execution(* com.li.spring.User.Add(..))")
    public void Around(ProceedingJoinPoint proceedingJoinPoint){
        System.out.println("环绕之前...........");
        try {
            Object proceed = proceedingJoinPoint.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        System.out.println("环绕之后...........");
    }
}

在这里插入图片描述

基于配置文件

1.准备要增强的类及方法

public class People {
    public void say(){
        System.out.println("say................");
    }
}
public class PeopleProxy {
    public void before(){
        System.out.println("before.................");
    }
}

2.在spring的配置文件中创建两个类

<bean id="people" class="com.li.spring.People"></bean>
    <bean id="peopleproxy" class="com.li.spring.PeopleProxy"></bean>

3.在spring的配置文件中配置切入点

<!--配置aop增强-->
    <aop:config>
        <!--切入点-->
        <aop:pointcut id="p" expression="execution(* com.li.spring.People.say(..))"/>
        <!-- 配置切面-->
        <aop:aspect ref="peopleproxy">
            <!--配置增强作用在具体的方法上 -->
            <aop:before method="before" pointcut-ref="p"></aop:before>
        </aop:aspect>
    </aop:config>

4.测试

public class test {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("bean4.xml");
        People people = context.getBean("people", People.class);
        people.say();
    }
}

在这里插入图片描述

相关文章
|
3月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
364 3
|
3月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
463 0
|
2月前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
1608 37
|
2月前
|
安全 Java 测试技术
《深入理解Spring》单元测试——高质量代码的守护神
Spring测试框架提供全面的单元与集成测试支持,通过`@SpringBootTest`、`@WebMvcTest`等注解实现分层测试,结合Mockito、Testcontainers和Jacoco,保障代码质量,提升开发效率与系统稳定性。
|
2月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
3月前
|
安全 IDE Java
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
本文介绍了如何在 Spring 应用程序中使用 Project Lombok 的 `@Data` 和 `@FieldDefaults` 注解来减少样板代码,提升代码可读性和可维护性,并探讨了其适用场景与限制。
156 0
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
|
4月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
4月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
2月前
|
监控 Java Spring
AOP 切面编程
AOP(面向切面编程)通过动态代理在不修改源码的前提下,对方法进行增强。核心概念包括连接点、通知、切入点、切面和目标对象。常用于日志记录、权限校验、性能监控等场景,结合Spring AOP与@Aspect、@Pointcut等注解,实现灵活的横切逻辑管理。
432 6
AOP 切面编程