详解SpringBoot之集成Spring AOP

下面是详解SpringBoot之集成SpringAOP的完整攻略:

什么是Spring AOP

Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要模块。它实现了基于代理的AOP,并且与IOC容器无缝集成,提供了便捷的配置方式。

面向切面编程就是将通用的横切关注点(如日志、安全、事务等)从业务逻辑中分离出来,形成一个独立的逻辑单元,这样可以在不干扰业务逻辑的情况下,清晰、模块化地实现这些横切关注点。

Spring AOP的核心概念

Spring AOP的核心概念包括:

  • 切面(Aspect):它是横切关注点的模块化。切面定义了在哪个连接点(JoinPoint)上执行哪个通知(Advice)。

  • 连接点(Join Point):程序的执行时机,如方法执行或异常抛出等。

  • 切入点(Pointcut):匹配连接点的规则,用于限定通知执行的范围。

  • 通知(Advice):执行在连接点上的操作。通知包括忽略返回值、在连接点前后执行的增强处理、环绕通知等。

  • 引入(Introduction):在通知之外为类型添加新的方法或属性,一般不太用到。

  • 织入(Weaving):把切面应用到目标对象并创建新的代理对象的过程。

Spring AOP的通知类型包括:

  • 前置通知(Before Advice):在连接点之前运行的通知方法。

  • 后置通知(After Advice):在连接点之后运行的通知方法。

  • 返回通知(After Returning Advice):在连接点正常完成后运行的通知方法。

  • 异常抛出通知(After Throwing Advice):在连接点抛出异常后运行的通知方法。

  • 环绕通知(Around Advice):在连接点前后都运行的通知方法。

Spring AOP的使用

现在我们来看看在Spring Boot中如何集成Spring AOP。下面是步骤:

步骤一:引入AOP依赖

在maven配置文件中,添加以下依赖:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

步骤二:创建切面类

在创建切面时,需要使用@Aspect注解标注,同时定义切点和通知类型。以下是一个简单的切面类的示例代码:

@Aspect
@Component
public class LogAspect {

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

    @Before("logPointcut()")
    public void beforeMethod(JoinPoint jp){
        String className = jp.getSignature().getDeclaringTypeName();
        String methodName = jp.getSignature().getName();
        System.out.println("==> " + className + "." + methodName + "() 调用开始。");
    }

    @AfterReturning(returning = "result", pointcut = "logPointcut()")
    public void afterReturningMethod(JoinPoint jp, Object result) {
        String className = jp.getSignature().getDeclaringTypeName();
        String methodName = jp.getSignature().getName();
        System.out.println("==> " + className + "." + methodName + "() 调用结束。返回值:" + result);
    }

    @AfterThrowing(throwing = "ex", pointcut = "logPointcut()")
    public void afterThrowingMethod(JoinPoint jp, Exception ex) {
        String className = jp.getSignature().getDeclaringTypeName();
        String methodName = jp.getSignature().getName();
        System.out.println("==> " + className + "." + methodName + "() 抛出异常:" + ex.getMessage());
    }
}

以上代码定义了一个切面类:LogAspect,其中定义了三个通知。

  • 前置通知:在连接点之前输出方法调用开始的提示语句。

  • 返回通知:在连接点正常完成后输出方法调用结束和返回值的提示语句。

  • 异常抛出通知:在连接点抛出异常后输出异常提示语句。

步骤三:在应用程序中使用切面

在需要应用切面的类或方法上使用@Aspect注解即可,下面是一个简单的示例:

@Service
public class DemoService {

    public String sayHello(String name) {
        System.out.println("Hello, " + name);
        return "result";
    }

    @Log
    public void doSomething(String input){
        System.out.println("doing something...");
    }
}

在上述示例中,我们在方法doSomething上使用了@Log注解,该注解作为一个切点进行切入。

示例

下面是一个完整的示例代码:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {
            DemoService demoService = ctx.getBean(DemoService.class);
            String greeting = demoService.sayHello("World");
            System.out.println(greeting);
            demoService.doSomething("test");
        };
    }
}

@Service
public class DemoService {

    public String sayHello(String name) {
        System.out.println("Hello, " + name);
        return "result";
    }

    @Log
    public void doSomething(String input){
        System.out.println("doing something...");
    }
}

@Aspect
@Component
public class LogAspect {

    @Pointcut("@annotation(com.example.demo.annotation.Log)")
    public void logPointcut(){}

    @Before("logPointcut()")
    public void beforeMethod(JoinPoint jp){
        String className = jp.getSignature().getDeclaringTypeName();
        String methodName = jp.getSignature().getName();
        System.out.println("==> " + className + "." + methodName + "() 调用开始。");
    }

    @AfterReturning(returning = "result", pointcut = "logPointcut()")
    public void afterReturningMethod(JoinPoint jp, Object result) {
        String className = jp.getSignature().getDeclaringTypeName();
        String methodName = jp.getSignature().getName();
        System.out.println("==> " + className + "." + methodName + "() 调用结束。返回值:" + result);
    }

    @AfterThrowing(throwing = "ex", pointcut = "logPointcut()")
    public void afterThrowingMethod(JoinPoint jp, Exception ex) {
        String className = jp.getSignature().getDeclaringTypeName();
        String methodName = jp.getSignature().getName();
        System.out.println("==> " + className + "." + methodName + "() 抛出异常:" + ex.getMessage());
    }
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {}

在上述示例代码中:

  • DemoService类中定义了一个sayHello方法和一个doSomething方法,并在doSomething方法上使用了@Log注解。

  • LogAspect切面类中定义了一个切点和三个通知。

  • @Log注解是我们自定义的注解,在需要记录日志的方法上进行标注。

当我们运行上述代码时,可以看到控制台输出了以下内容:

Hello, World
==> com.example.demo.service.DemoService.doSomething() 调用开始。
doing something...
==> com.example.demo.service.DemoService.doSomething() 调用结束。返回值:null

以上就是集成Spring AOP的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解SpringBoot之集成Spring AOP - Python技术站

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

相关文章

  • UniApp + SpringBoot 实现微信支付和退款功能

    UniApp 是一款跨平台的移动应用开发框架,通常可同时构建出 iOS 和 Android 应用。SpringBoot 是一款流行的 Java Web 开发框架,提供了快速搭建 web 应用的能力。通过结合起来,可以实现微信支付和退款功能。 第一步:注册微信开发者账号 如果没有微信开发者账号,需要手动注册一个。注册成功后,需要进行微信支付相关的配置,包括商户…

    Java 2023年5月23日
    00
  • 详解Java内存溢出的几种情况

    详解Java内存溢出的几种情况 Java是一种自动管理内存的语言,但是在极端情况下也有可能出现内存泄漏或内存溢出的问题。本文将详细讲解Java内存溢出的几种情况,包括示例说明。 什么是Java内存溢出 Java内存溢出指的是程序申请的内存量超出了JVM虚拟机规定的内存限制,导致JVM无法再为申请内存分配空间。这时程序会出现异常并中断执行。 几种引起Java内…

    Java 2023年5月27日
    00
  • 详解java生成json字符串的方法

    详解Java生成JSON字符串的方法 什么是JSON格式 在介绍Java生成JSON字符串的方法之前,我们先来了解一下什么是JSON格式。JSON,全称JavaScript Object Notation,是一种轻量级数据交换格式,与XML类似,但更加简洁。它使用键值对的形式来表示数据,通常有以下特点: 易于阅读、编写、理解 易于解析和生成 支持多种编程语言…

    Java 2023年5月26日
    00
  • spring注解 @PropertySource配置数据源全流程

    Spring注解 @PropertySource 用于加载指定的属性源,是Spring Framework 4.0版本之后提供的新特性。它允许我们从外部文件或环境变量中读取配置信息,灵活地管理我们的应用程序的数据源。 下面是使用 @PropertySource 配置数据源的完整流程: 引入依赖 在项目的 pom.xml 文件中添加以下依赖: <depe…

    Java 2023年6月2日
    00
  • Spring Data JPA实现排序与分页查询超详细流程讲解

    下面我来详细讲解一下“Spring Data JPA实现排序与分页查询超详细流程讲解”的完整攻略。本教程共包含以下五个步骤: 引入依赖 在pom.xml文件中加入以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>…

    Java 2023年6月2日
    00
  • 微信小程序后台解密用户数据实例详解

    微信小程序后台解密用户数据实例详解 微信小程序开发中获取用户信息是一个常见的需求,而用户信息是加密的,需要在后台进行解密。本文将详细讲解解密用户数据的过程及相关注意事项。 准备工作 在进行解密用户数据之前,需要先获取到用户信息加密数据(encryptedData)和加密密钥(session_key),具体获取方式请参考微信小程序官方文档。 解密过程 步骤一:…

    Java 2023年5月30日
    00
  • SpringBoot超详细讲解@Enable*注解和@Import

    细致讲解@Enable*注解和@Import注解在SpringBoot中的用法: @Enable*注解 @Enable注解是SpringBoot中用来启用某些功能的注解,它们定义在org.springframework.boot.autoconfigure包中,以下是一些常用的@Enable注解: @EnableAutoConfiguration:自动配置,…

    Java 2023年5月19日
    00
  • Java可以写android的应用程序吗

    当然可以。Android是基于Java语言的。Android SDK提供了一组Java API,可用于Android平台上的开发。因此,开发Java应用程序也可以在Android上运行。 如果您已经熟悉Java编程,那么您可以很快地开始使用Android的开发工具和库来创建自己的应用程序,具体步骤如下: 安装Android Studio:Android St…

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