一文详解Spring AOP的配置与使用

一文详解Spring AOP的配置与使用攻略

1. Spring AOP简介

Spring AOP是Spring框架中的一个模块,它提供了基于代理的AOP实现。

AOP(Aspect Oriented Programming)即面向切面编程,是一种编程范式。它通过在程序运行期间动态地将代码切入到类的指定方法或指定位置上,实现一些特定功能。

Spring AOP中的切面有如下几种类型:

  • Before:在某个连接点(方法或者字段)之前执行。
  • After:在某个连接点(方法或者字段)之后执行,不管其是否成功。
  • After-returning:在某个连接点(方法或者字段)正常结束后执行。
  • After-throwing:在某个连接点(方法或者字段)抛出异常时执行。
  • Around:在某个连接点(方法或者字段)执行时,执行前后触发操作。

2. Spring AOP的配置

Spring AOP的配置分为三部分:切面、通知和切点。

2.1 切面

切面是切入到目标对象(被代理对象)上的一段代码。在Spring AOP中,切面的配置可以通过XML文件方式或注解方式进行。

  • XML配置方式:
<aop:aspect id="logAspect" ref="logAspectBean">
    <!-- 切点 -->
    <aop:pointcut id="logPointCut" expression="execution(* com.example.demo.service.*.*(..))" />

    <!-- 通知 -->
    <aop:before method="beforeMethod" pointcut-ref="logPointCut" />
</aop:aspect>

<bean id="logAspectBean" class="com.example.demo.aspect.LogAspect" />
  • 注解配置方式:
@Aspect
@Component
public class LogAspect {
    @Pointcut("execution(* com.example.demo.service.*.*(..))")
    public void logPointCut() {}

    @Before("logPointCut")
    public void beforeMethod() {}
}

2.2 通知

通知是切面中的一段代码,它就是在切入点(连接点)执行时执行的代码。通知的类型有五种,分别是Before、After、After-returning、After-throwing和Around。

  • Before通知:
public void beforeMethod() {
    System.out.println("Before Advice");
}
  • After通知:
public void afterMethod() {
    System.out.println("After Advice");
}
  • After-returning通知:
public void afterReturningMethod() {
    System.out.println("After Returning Advice");
}
  • After-throwing通知:
public void afterThrowingMethod() {
    System.out.println("After Throwing Advice");
}
  • Around通知:
public Object aroundMethod(ProceedingJoinPoint point) throws Throwable {
    System.out.println("Around Before Advice");
    Object result = point.proceed();
    System.out.println("Around After Advice");
    return result;
}

2.3 切点

切点是程序中真正被代理的对象。它是代理对象要处理的方法的集合。切点可以使用表达式的方式来描述具体的哪些方法被拦截。

表达式的写法:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)

其中:

  • modifiers-pattern:可选的访问修饰符(public、protected等);
  • ret-type-pattern:方法返回类型;
  • declaring-type-pattern:方法所属的类;
  • name-pattern:方法名称;
  • param-pattern:方法参数;
  • throws-pattern:抛出的异常。

示例1:

<aop:pointcut id="logPointCut" expression="execution(* com.example.demo.service.*.*(..))" />

示例2:

@Pointcut("execution(* com.example.demo.service.*.*(..))")
public void logPointCut() {}

3. Spring AOP的使用

下面通过一个简单的例子,来演示Spring AOP的使用。

3.1 编写被代理的类

public class HelloServiceImpl implements HelloService {
    @Override
    public void sayHello(String name) {
        System.out.println("Hello, " + name);
    }
}

3.2 编写切面

@Aspect
@Component
public class LogAspect {
    @Pointcut("execution(* com.example.demo.service.HelloServiceImpl.sayHello(..))")
    public void logPointCut() {}

    @Before("logPointCut()")
    public void beforeMethod() {
        System.out.println("Before Advice");
    }
}

3.3 编写Spring配置文件

<bean id="helloService" class="com.example.demo.service.HelloServiceImpl" />
<bean id="logAspect" class="com.example.demo.aspect.LogAspect" />

<aop:config>
    <aop:aspect ref="logAspect">
        <aop:pointcut id="logPointCut" expression="execution(* com.example.demo.service.HelloServiceImpl.sayHello(..))" />
        <aop:before method="beforeMethod" pointcut-ref="logPointCut" />
    </aop:aspect>
</aop:config>

3.4 测试

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        HelloService helloService = (HelloService) context.getBean("helloService");
        helloService.sayHello("world");
    }
}

运行结果:

Before Advice
Hello, world

4. 总结

Spring AOP的配置和使用相对来说比较简单,只需要掌握好切面、通知和切点三个概念,就可以轻松地进行AOP的配置和使用。同时,Spring AOP的代理方式是基于JDK动态代理和CGLIB动态代理实现的,也可以用来代理接口和类。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解Spring AOP的配置与使用 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Spring mvc工作原理_动力节点Java学院整理

    Spring MVC工作原理 Spring MVC是一种流行的 Java Web 应用程序开发框架,它基于模型-视图-控制器(MVC)设计模式来构建 Web 应用程序。其工作原理如下: 请求的处理流程 客户端向服务器发送HTTP请求,请求到达服务器后,首先到达前端控制器Front Controller。 Front Controller将请求传递给处理器处理…

    Java 2023年6月15日
    00
  • java实现验证码小程序

    我将为你讲解“Java实现验证码小程序”的完整攻略。 目录 什么是验证码 验证码实现的基本思路 Java实现验证码小程序详解 第一步:生成验证码字符 第二步:绘制验证码图片 第三步:输出图片到页面 示例说明 示例1:生成随机字符串 示例2:绘制验证码图片 什么是验证码 验证码是指一种用于区分用户是计算机还是真实用户的图形或文字信息。常用于防止恶意的程序自动提…

    Java 2023年5月23日
    00
  • Java中try catch处理异常示例

    下面就是“Java中try catch处理异常示例”的详细讲解。 1. 什么是异常? 在Java程序运行过程中,可能会遇到一些非正常的情况,例如读取文件时文件不存在、网络连接异常等等,这些非正常的情况被称为“异常”。 Java中的异常是Throwable类及其子类的实例,可分为检查型异常和非检查型异常(也叫运行时异常)。其中,检查型异常必须显式处理,而非检查…

    Java 2023年5月28日
    00
  • java BASE64Encoder详细介绍及简单实例

    Java BASE64Encoder详细介绍及简单实例 在Java中,BASE64编码是一种十分常见的数据编码方式,它将二进制数据编码成ASCII字符以方便传输。而在Java中有一个BASE64Encoder类,提供了方便的数据编码和解码功能。 BASE64Encoder类介绍 BASE64Encoder类是Java内置的实现BASE64编解码的类,它可以将…

    Java 2023年5月20日
    00
  • maven加入spring框架的详细教程

    下面是关于“maven加入spring框架的详细教程”的完整攻略,包含两个示例说明。 maven加入spring框架的详细教程 Maven是一个流行的Java项目管理工具,它可以帮助我们更加方便地管理项目依赖关系。在Java项目中,Spring框架是一个非常流行的框架,它可以帮助我们更加方便地构建现代化的企业应用程序。本文将介绍如何使用Maven将Sprin…

    Java 2023年5月17日
    00
  • SpringBoot扩展外部化配置的原理解析

    下面我为你详细讲解“SpringBoot扩展外部化配置的原理解析”的攻略。 1. 理解SpringBoot配置管理流程 SpringBoot使用YAML或properties格式的文件来管理应用程序所需的各种配置信息。它们可以分为应用表现配置和逻辑配置两类,其中应用表现配置是指一些与应用程序用户直接交互的配置,例如网站标题和页脚等。逻辑配置是指一些与应用程序…

    Java 2023年5月31日
    00
  • 一小时迅速入门Mybatis之bind与多数据源支持 Java API

    下面是关于“一小时迅速入门 Mybatis 之 bind 与多数据源支持 Java API”的完整攻略: 什么是 Mybatis Mybatis 是一款优秀的 Java ORM 框架,它的主要作用是将数据库表映射成 Java 对象。在 Mybatis 中,可以通过 XML 或 Java 注解的方式进行数据映射,同时提供了丰富的 SQL 语句拼接、缓存、事务控…

    Java 2023年5月20日
    00
  • Web 开发中Ajax的Session 超时处理方法

    Web 开发中 Ajax 的 Session 超时处理方法 Web 开发中,Ajax 是我们常用的一种技术,通过 Ajax 可以实现无需重载页面的异步数据交互。而在使用 Ajax 过程中,我们常常需要与后端服务器进行会话(Session)保持。但是,随着时间的推移,为了保证网站的安全性和可靠性,Web 服务器上的 Session 会定期过期并被删除,这样会导…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部