Spring基础篇:使用XML方式实现Spring提供的AOP

简介: 使用XML方式实现Spring提供的AOP
AOP: 核心是在不改动源代码时,对已有代码进行增强。这个增强操作可以是业务逻辑外的其他重复出现的操作或任务。

前期准备

以Spring为框架,只需要准备一个待加强的类。

以一个用户登录的例子,这个类中有两个方法,登录和登出。现在需要做一件事,在登录前输出当前时刻,在登出前也输出当前时刻。

public class UserService {
    public void login(){
        // 增强1
        System.out.println("用户登录");
    }

    public void logOut(){
        // 增强2
        System.out.println("用户登出");
    }
}

增强类

这里使用了日期模板,以及使用模板输出时间。

public class TimePrint {
    SimpleDateFormat matter = new SimpleDateFormat("现在时间:yyyy年MM月dd日E HH时mm分ss秒");
    public void printTime(){
        System.out.println(matter.format(new Date()));
    }
}

注意事项:

Spring底层还是使用的是aspectj的方式,所以一定要再加上该依赖。

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.1</version>
</dependency>

使用XML的方式

模板:这里的命名空间中加上了aop的命名空间

<?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
                           https://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>

将类注册到容器中

待增强类 和 增强的工具类都注入到容器中

<bean id="userService" class="juejin.aopXml.bean.UserService"></bean>
<bean id="timePrint" class="juejin.aopXml.utils.TimePrint"></bean>

使用配置的方式,配置aop

固定写法:

其中,<aop:aspect id="timeAspect" ref="timePrint">,重要的是ref指向的是增强类。

<aop:config>
    <aop:aspect id="timeAspect" ref="timePrint">
        
    </aop:aspect>
</aop:config>

Ok,Ok。现在暂停了解一下Spring给我们提供的加强类型有哪些(简单点说就是,你希望加强的方法执行具体方法的什么时候去执行)。主要有以下几个(该无序内容引自:从 0 开始深入学习 Spring - LinkedBear - 掘金小册 (juejin.cn)):

  • before 前置通知:目标对象的方法调用之前触发。
  • after后置通知:目标对象的方法调用之后触发。
  • afterReturning 返回通知:目标对象的方法调用完成,在返回结果值之后触发。
  • afterThrowing 异常通知:目标对象的方法运行中抛出 / 触发异常后触发。
  • around 环绕通知:编程式控制目标对象的方法调用。

那么目标很明确,我们要做的是目标对象的方法调用之前触发,也就是在执行System.out.println("用户登录");之前,执行System.out.println(new Date().getTime());

了解了加强类型,我们需要写的是,告诉Spring哪个方法需要被增强。先看我直接写出来,再理解其中的意思。

<aop:before method="printTime" pointcut="execution(public * juejin.aopXml.bean.UserService.* (..))"></aop:before>
  1. 内容都被<aop:before></aop:before>包围着,这就是上面说的:前置通知,目标对象的方法调用之前触发。
  2. method="printTime":表示调用增强类中的printTime()方法。
  3. pointcut="" :表示上面的具体要给哪个类中的哪个方法进行printTime()增强。
  4. 这的切点表达式意思是: 方法要求是:public的,范围值任意,在juejin.aopXml.bean包下,在UserService类中的任意方法,参数个数任意。
pointcut="",这个引号中的内容是关于 切点表达式的内容,这个具体的使用内容因篇幅原因在其他文章中介绍。

启动类

使用了线程的睡眠方式,睡眠一秒,测试两个方法是否被增强。

public class AopXmlApplication {
    public static void main(String[] args) throws InterruptedException {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("juejin/aopXml/xmlAop.xml");
        UserService userService = ctx.getBean(UserService.class);
        userService.login();
        Thread.sleep(1000);
        userService.logOut();
    }
}

输出:

现在时间:2022年12月04日星期日 21时23分51秒
用户登录
现在时间:2022年12月04日星期日 21时23分52秒
用户登出

附录:完整的XML-aop配置内容

    <aop:config>
        <aop:aspect id="timeAspect" ref="timePrint">
            <aop:before method="printTime" pointcut="execution(public * juejin.aopXml.bean.UserService.* (..))"></aop:before>
        </aop:aspect>
    </aop:config>
目录
相关文章
|
3天前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
7天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
40 6
|
1月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
27天前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
53 5
|
1月前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
64 8
|
1月前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
1月前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
44 5
|
1月前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
45 4
|
2月前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
54 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
1月前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
40 1