SpringBoot的AOP编程

本文介绍了SpringBoot中的AOP编程,包括AOP的概念及其在对象间依赖关系中的作用。文章以日志记录为例,详细讲解了AOP的一般使用,并进一步探讨了自定义注解的开发过程,包括配置yml文件、定义注解、使用注解以及装配写入点和切面的实现。内容涵盖了JDK动态代理和CGLIB两种动态代理方式。
摘要由CSDN通过智能技术生成

概述

Spring的两大核心思想:
IOC
IOC(Inversion of Control) 控制反转:对象的创建 由原来代码中new的方法 转移到 spring的配置文件中,由spring工 厂进行创建。

spring不仅提供了对 对象的管理,而且对象和对象 间的依赖关系 也提供了 完美的解决方案–即,DI(Dependency Injection)依赖注入

AOP
面向切面编程
AOP的使用场景:在主要功能上 增加 可有可用的额外功能时 使用。
在这里插入图片描述

AOP的一般使用

依赖坐标
   	`<!--aop启动器-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-aop</artifactId>
       </dependency>
       <!--注解式开发-->
       <dependency>
           <groupId>org.aspectj</groupId>
           <artifactId>aspectjweaver</artifactId>
       </dependency>
开发切面整合切入点

以一个执行日志记录为示例


package com.baizhi.aspect;

import com.baizhi.entity.LogEntity;
import com.baizhi.service.LogService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.UUID;

@Component //将此类交给工厂管理
@Aspect		//定义切面
@Slf4j		//引入日志
public class TestBeforeAdvice {
   
    @Autowired
    HttpServletRequest request; //此对象可由工厂自动管理
  
//定义切入点,因为此注解只可用在方法上,所以随机定义一个无意义的方法
@Pointcut(value = "execution(* com.baizhi.service.*.*(..))")
   public void pt() {
      }

//配置环绕通知
 @Around(value = "pt()")
 		//ProceedingJoinPoint  参数是 JoinPoint 连接点 的子类
    public Object testAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
   
		
        System.out.println("this is around before");

		 try {
   
            proceed = proceedingJoinPoint.proceed();   //调用目标方法,必须proceed,目标方法才可执行
            return proceed; //此对象包含了原目标方法中的方法名、参数信息、方法对象等信息...
        } catch (Throwable throwable) {
   
        	/*这里不直接抛出异常,是因为 业务层事务的关系,相当与这里有2层事务,当执行有误后,日志可以正常记录,而保证业务层事务正常,所有捕获到执行失败,本次日志将记录,同时,不会让外层事务得不到异常*/
            throw throwable;
        } finally {
   
            log.info("执行完毕”);
        }		
	}

自定义注解开发

注意:自定义注解时,需要改变代理类的实现方式为CGLIB.
AOP动态代理有两种实现方式

    1. Proxy JDK的反射包,aop默认采用 动态代理类 实现(目标类实现的)接口。
    1. CGLIB 开源(对
当您使用Spring Boot AOP(面向切面编程)时,可以通过创建切面、定义切点和编通知来实现横切关注点的功能。下面是一个简单的示例,演示如何使用Spring Boot AOP编程: 1. 首先,确保在pom.xml文件中添加了`spring-boot-starter-aop`依赖项: ```xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 2. 创建一个切面类`LoggingAspect`,使用`@Aspect`注解标记为切面: ```javaimport org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect@Componentpublic class LoggingAspect { @Before("execution(* com.example.demo.*.*(..))") public void beforeAdvice() { System.out.println("Before executing the method..."); } } ``` 在上述代码中,`@Before`注解指定了在执行匹配切点的方法之前要执行的通知。`execution(* com.example.demo.*.*(..))`是一个切点表达式,它表示匹配`com.example.demo`包下的所有类的所有方法。 3. 创建一个简单的示例类`DemoController`: ```javaimport org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestControllerpublic class DemoController { @GetMapping("/hello") public String hello() { return "Hello, World!"; } } ``` 4. 运行Spring Boot应用程序,您将看到在访问`/hello`接口时,控制台将输出`Before executing the method...`的信息。 这个示例展示了一个简单的切面,它在执行匹配切点的方法之前打印出一条消息。您可以根据自己的需求编更复杂的切面和通知。 希望这个示例能帮助您理解如何在Spring Boot中使用AOP编程。如果您有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值