【重温SSM框架系列】10 - Spring AOP开发的两种方式(基于XML、基于注解)

简介: 【重温SSM框架系列】10 - Spring AOP开发的两种方式(基于XML、基于注解)

概述

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

AOP开发是以动态代理为底层原理的,它的开发步骤也与动态代理类似,只是把方法增强部分交给了Spring去管理。

下面介绍AOP开发的两种方式:

  • 基于XML的AOP 开发
  • 基于注解的AOP 开发

基于XML 的AOP 开发

1. 导入AOP依赖包

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>
<!-- AOP -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.13</version>
</dependency>
AI 代码解读

2. 创建目标类和接口

public class Target implements TargetInterface {
    @Override
    public void coreWork() {
        System.out.println("===核心业务方法运行===");
    }
}
AI 代码解读
public interface TargetInterface {
    public void coreWork();
}
AI 代码解读

3. 创建切面类(增强方法类)

public class Aspect {

    public void before(){
        System.out.println("对核心业务方法执行前的增强......");
    }

    public void after(){
        System.out.println("后置增强......");
    }
AI 代码解读

4. 将目标类和切面类交给Spring管理

    <!-- 目标对象 -->
    <bean id="target" class="com.wang.aop.Target"></bean>

    <!-- 切面对象 -->
    <bean id="aspect" class="com.wang.aop.Aspect"></bean>
AI 代码解读

5. 在核心配置文件中配置织入关系

    <aop:config>
        <aop:aspect ref="aspect">
            <aop:before method="before" pointcut="execution(public void com.wang.aop.Target.coreWork())"/>
            <aop:after method="after" pointcut="execution(public void com.wang.aop.Target.coreWork())"/>
        </aop:aspect>
    </aop:config>
AI 代码解读

测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AopTest {

    @Autowired
    private TargetInterface target;

    @Test
    public void test() {
        target.coreWork();
    }
}
AI 代码解读

在这里插入图片描述

XML 配置AOP

切点表达式的写法

execution([修饰符] 返回值类型包名.类名.方法名(参数))

  • 访问修饰符可以省略
  • 返回值类型、包名、类名、方法名可以使用星号*代表任意
  • 包名与类名之间一个点. 代表当前包下的类,两个点.. 表示当前包及其子包下的类
  • 参数列表可以使用两个点.. 表示任意个数,任意类型的参数列表

通知的配置

<aop:通知类型method=“切面类中方法名” pointcut=“切点表达式"></aop:通知类型>

通知类型 标签 解释
前置通知 <aop:before> 用于配置前置通知。指定增强的方法在切入点方法之前执行
后置通知 <aop:after-returning> 用于配置后置通知。指定增强的方法在切入点方法之后执行
环绕通知 <aop:around>> 用于配置环绕通知。指定增强的方法在切入点方法之前和之后都执行
异常抛出通知 <aop:throwing>> 用于配置异常抛出通知。指定增强的方法在出现异常时执行
最终通知 <aop:after>> 用于配置最终通知。无论增强方式执行是否有异常都会执行

aop织入的配置

<aop:config>
    <aop:aspect ref=“切面类”>
        <aop:before method=“通知方法名称” pointcut=“切点表达式"></aop:before>
    </aop:aspect>
</aop:config>
AI 代码解读

基于注解的AOP开发

基于注解开发,Spring也提供了注解的AOP开发。

1. 创建目标接口和目标类(内部有切点)

public class Target implements TargetInterface {
    @Override
    public void coreWork() {
        System.out.println("===核心业务方法运行===");
    }
}
AI 代码解读
public interface TargetInterface {
    public void coreWork();
}
AI 代码解读

2. 创建切面类(增强方法类)

public class Aspect {

    public void before(){
        System.out.println("对核心业务方法执行前的增强......");
    }

    public void after(){
        System.out.println("后置增强......");
    }
AI 代码解读

3. 将目标类和切面类的对象创建权交给spring并使用注解配置织入关系

在这里插入图片描述

@Component("aspect")
@Aspect
public class MyAspect {

    @Before("execution(* com.wang.aop.innovation.*.*(..))")
    public void before(){
        System.out.println("对核心业务方法执行前的增强......");
    }

    @After("execution(* com.wang.aop.innovation.*.*(..))")
    public void after(){
        System.out.println("后置增强......");
    }
}
AI 代码解读

4. 在配置文件中开启组件扫描和AOP 的自动代理

<context:component-scan base-package="com.wang.aop.innovation"/>

<!--aop的自动代理-->
<aop:aspectj-autoproxy/>
AI 代码解读

测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AopTest {

    @Autowired
    private TargetInterface target;

    @Test
    public void test() {
        target.coreWork();
    }
}
AI 代码解读

在这里插入图片描述

注解通知的类型

通知类型 注解 解释
前置通知 @Before 用于配置前置通知。指定增强的方法在切入点方法之前执行
后置通知 @after-returning 用于配置后置通知。指定增强的方法在切入点方法之后执行
环绕通知 @around 用于配置环绕通知。指定增强的方法在切入点方法之前和之后都执行
异常抛出通知 @throwing 用于配置异常抛出通知。指定增强的方法在出现异常时执行
最终通知 @after 用于配置最终通知。无论增强方式执行是否有异常都会执行
目录
打赏
0
0
0
0
2
分享
相关文章
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
从基础到进阶:Spring Boot + Thymeleaf 整合开发中的常见坑与界面优化
本文深入探讨了 **Spring Boot + Thymeleaf** 开发中常见的参数绑定问题与界面优化技巧。从基础的 Spring MVC 请求参数绑定机制出发,分析了 `MissingServletRequestParameterException` 的成因及解决方法,例如确保前后端参数名、类型一致,正确设置请求方式(GET/POST)。同时,通过实际案例展示了如何优化支付页面的视觉效果,借助简单的 CSS 样式提升用户体验。最后,提供了官方文档等学习资源,帮助开发者更高效地掌握相关技能。无论是初学者还是进阶用户,都能从中受益,轻松应对项目开发中的挑战。
113 0
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
66 0
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
本文详细讲解了Java开发者如何基于Spring AI Alibaba框架玩转MCP(Model Context Protocol),涵盖基础概念、快速体验、服务发布与调用等内容。重点包括将Spring应用发布为MCP Server(支持stdio与SSE模式)、开发MCP Client调用服务,以及在Spring AI Alibaba的OpenManus中使用MCP增强工具能力。通过实际示例,如天气查询与百度地图路线规划,展示了MCP在AI应用中的强大作用。最后总结了MCP对AI开发的意义及其在Spring AI中的实现价值。
1103 9
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。
面向切面编程(AOP)介绍--这是我见过最易理解的文章
这是我见过的最容易理解的文章,由浅入深介绍AOP面向切面编程,用科普版和专家版分别解说,有概念,有代码,有总结。
|
10月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
200 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等