Spring AOP基本概念

下面是关于Spring AOP基本概念的完整攻略。

1. 什么是AOP

AOP(Aspect-Oriented Programming),即面向切面编程,是OOP(Object-Oriented Programming)的一种扩展。OOP需要在类中定义方法,在方法中编写业务逻辑代码。而AOP则通过预先定义好的切面将所有对象的横切关注点分离出来,然后统一交给切面去处理。这样既避免了大量代码的重复,又降低了业务代码和横切逻辑代码之间的耦合性。

2. Spring AOP基本概念

2.1 切面(Aspect)

切面是一种模块化的代码,通常用来处理跨越多个类(业务类)的问题。比如说,日志、事务、权限控制等。切面可以很好地模块化这些关注点并使得代码复用和维护变得更加容易。

2.2 连接点(Join point)

连接点是程序中能够使用切面的具体位置,例如方法的调用、异常的抛出、属性的读写等等。Spring AOP只支持方法级别的连接点。

2.3 通知(Advice)

通知是切面具体的业务逻辑,是实现横切逻辑的代码。通知分为前置通知(Before)、后置通知(After)、返回通知(AfterReturning)、异常通知(AfterThrowing)和环绕通知(Around)。

2.4 切入点(Pointcut)

切入点是一个表达式,指定了哪些连接点会被切面拦截。可以使用表达式语言(AspectJ expression language)指定切入点。切入点实际上就是包含了一系列连接点的集合。

2.5 引入(Introduction)

引入是一种方式,可以新增一些属性和方法到被通知的类中。引入可以让我们非常方便地向目标类中添加一些方法和属性。

2.6 目标对象(Target Object)

目标对象是我们实际编写业务逻辑的JavaBean,它是方法的执行者。

2.7 AOP代理(AOP Proxy)

AOP代理是Spring AOP框架生成的对象,它包含了目标对象和切面。在运行时,Spring AOP框架会为目标对象生成代理对象,在代理对象上应用切面。所以,我们执行的方法实际上是代理对象的方法。

3. Spring AOP示例

3.1 示例1:使用AspectJ表达式配置切入点

首先,需要添加Spring AOP和AspectJ的依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>${aspectj.version}</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>${aspectj.version}</version>
</dependency>

然后,创建一个切面,并实现前置通知和后置通知。

@Aspect
@Component
public class UserServiceAspect {

    @Before("execution(public * com.example.service.UserService.*(..))")
    public void before(JoinPoint joinPoint) {
        System.out.println("before");
    }

    @AfterReturning(pointcut = "execution(public * com.example.service.UserService.*(..))", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("afterReturning");
    }
}

上面的代码中,使用AspectJ表达式(execution(public * com.example.service.UserService.*(..)))定义了一个切面,这个切面拦截了UserService中的所有公共方法。然后,在切面中实现了前置通知和后置通知,分别在目标方法执行前和执行后打印一段文字。

最后,在调用UserService中的方法时,Spring AOP框架会自动将切面应用到这个方法上。

3.2 示例2:使用XML配置切面和切入点

首先,需要在XML配置文件中添加如下配置:

<aop:aspectj-autoproxy />
<bean id="userServiceAspect" class="com.example.aspect.UserServiceAspect" />

<aop:config>
    <aop:pointcut id="userServicePointcut" expression="execution(public * com.example.service.UserService.*(..))" />
    <aop:advisor advice-ref="beforeAdvice" pointcut-ref="userServicePointcut" />
    <aop:advisor advice-ref="afterAdvice" pointcut-ref="userServicePointcut" />
</aop:config>

<bean id="userService" class="com.example.service.UserService" />

其中,<aop:aspectj-autoproxy />表示启用Spring AOP框架的自动代理功能。<bean id="userServiceAspect" class="com.example.aspect.UserServiceAspect" />表示声明一个切面。

<aop:config>中定义了一个切入点<aop:pointcut id="userServicePointcut" expression="execution(public * com.example.service.UserService.*(..))" />,用来拦截UserService中的所有公共方法。

然后,通过<aop:advisor>定义了两个通知,一个是前置通知,一个是后置通知。

最后,声明了一个UserService实例,这个实例中的所有公共方法都会被切面拦截处理。

@Service
public class UserService {

    public void addUser() {
        System.out.println("add user");
    }

    public void deleteUser() {
        System.out.println("delete user");
    }
}

上面的代码中,添加了一个addUser()和一个deleteUser()方法,这两个方法都是公共方法。

另外,我们需要在UserServiceAspect切面类中定义前置通知和后置通知。

@Component
public class UserServiceAspect {

    public void before() {
        System.out.println("before");
    }

    public void after() {
        System.out.println("after");
    }
}

最后,运行我们的程序,输出结果如下:

before
add user
after
before
delete user
after

从输出结果上可以看到,我们的切面成功拦截了UserService中的所有公共方法,并在目标方法的前面和后面执行了指定的通知。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring AOP基本概念 - Python技术站

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

相关文章

  • java web图片上传和文件上传实例详解

    Java Web 图片上传和文件上传实例详解 在 Java Web 开发中,图片上传和文件上传是一个非常常见的操作。本文将会介绍如何在 Java Web 中实现图片上传和文件上传,以及如何在前端进行用户体验的优化。 上传文件的基本步骤 上传文件的基本步骤如下: 创建一个表单,用于选择文件。表单的 method 必须为 POST, enctype 必须为 mu…

    Java 2023年5月20日
    00
  • spring/springboot整合curator遇到的坑及解决

    下面是“spring/springboot整合curator遇到的坑及解决”的完整攻略: 环境准备 首先,需要在本地或服务器上安装一个ZooKeeper集群,并开启相关端口。其次,根据具体的开发需求,在Spring或Spring Boot项目中集成Curator。 Spring/Spring Boot整合Curator 1. 添加Curator依赖 在Mav…

    Java 2023年5月20日
    00
  • 利用Springboot实现Jwt认证的示例代码

    本文将为大家详细讲解如何使用Spring Boot实现JWT认证,并提供两个示例说明。请按照下面的步骤操作。 前置条件 在开始之前,您需要了解: Java及其相关技术(Java web开发、Spring Boot框架等); JWT(JSON Web Token)认证方式的基本概念和使用方法。 步骤 1. 添加依赖 请在您的项目中添加Spring Securi…

    Java 2023年5月31日
    00
  • Spring Boot全局统一异常处理器

    Spring Boot全局统一异常处理器 在Spring Boot应用中,处理异常是一个非常重要的问题,因为不处理异常会导致程序出现问题。为了避免应用程序因异常而出现问题,我们需要使用一个全局统一异常处理器。 配置 在 Spring Boot 应用中,需要定义一个 @ControllerAdvice 注解的异常处理类,如下所示: @ControllerAdv…

    Java 2023年5月27日
    00
  • 一文带你揭秘SpringMvc参数值映射

    一文带你揭秘SpringMVC参数值映射 在SpringMVC中,参数值映射是将请求参数映射到控制器方法参数的过程。SpringMVC提供了多种参数值映射方式,包括基本类型、JavaBean、集合类型等。本文将详细介绍SpringMVC参数值映射的各种方式,并提供一些示例来说明这些方式的使用。 基本类型 在SpringMVC中,我们可以将请求参数映射到基本类…

    Java 2023年5月17日
    00
  • Go iota 常量基本语法介绍

    Go iota 常量基本语法介绍 Go中的常量是不可变的量,它们被赋值后不能再次更改。常量的值可以在编译时确定,并且它们具有比变量更严格的类型检查。 在Go语言中,有一个特殊的常量生成器叫做iota,可以用来创建一组枚举类型的常量。iota常量生成器初始化为0,并且每次使用后自动加1,一般在常量组中使用。 接下来我们将详细介绍Go iota常量的基本语法。 …

    Java 2023年5月26日
    00
  • Java面试题冲刺第十天–MyBatis2

    Java面试题冲刺第十天–MyBatis2 MyBatis是一个优秀的ORM(Object Relational Mapping)框架,提供了自动将对象与关系数据库进行映射的功能,使得Java Web开发更加简单、高效。本篇文章主要介绍MyBatis的进阶使用和最佳实践。 一、MyBatis的关键特性 MyBatis的核心特性包括: 自动化的SQL映射。M…

    Java 2023年5月20日
    00
  • Spring Security入门demo案例

    下面是Spring Security入门demo案例的完整攻略。 一、前置知识 在开始学习Spring Security入门demo案例之前,你需要具备以下一些基础知识: 基本的Java编程语言和Spring框架的了解; 熟悉Spring MVC框架的开发以及相关的Maven工程构建方式。 二、Spring Security简介 Spring Securit…

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