String AOP 切面组件, 切面(横截面 Aspect)(在...方法之前||在...方法之后)

Spring AOP 使用步骤:

1、导入包:

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

导入@Aspect包

2、创建切面组件,封装横切关注点代码(如:用户行为日志追踪)

3、标注通知@Before()//方法之前,同理@After()//方法之后

4、标注切入点”bean(userServiceipml)“

5、在切面中获取用户调用的方法:连接点(joinPoint)

6、日志的配置文件

@Aspect  //切面组件,注Aspect(org.aspectj.lang.annotation.Aspect;)

@Component //表示是一个组件,一个配置类(组件扫描,自动创建)

注:@Before //方法之前通知||同理@After()//方法之后

注:@bean(userServiceimpl)//找到一个java Bean(userServiceimpl)在这个bean方法执行之前先执行被@Before注释的类,每次执行"userServiceimpl"类之前,都先执行方法↓

注:方法如何获取???

  方法的参数joinPoint连接点,joinPoint有一个方法叫signature

注:signature// name:签名,方法的签名

什么是方法的签名?

方法名+方法的参数 = 方法签名 (方法的签名在java的反射包里面没有定义这么一个类),

Spring AOP专门为”方法的签名“定义了一个叫 Signature的一个类

注:signature// 方法名+方法的参数 = 方法签名

注:userServiceimp类调用那个方法那么就会把this方法传给joinpoint去执行,被传过来的userServiceimp某个方法就被称为     ”方法的签名“ ,总而言之,言而总之.....你调用的那个方法,那么该方法就是    ”方法的签名“

用Logger对象或者用@SLF4J注解其实差不多,只是SLF4J帮我写了Logger日志的对象,然而对项目的内存会占用一些内存会导致项目会慢一点点,用Logger对象还是用@SLF4J注解完全凭个人喜好

注:Joinpoint包为

注:Signature包

注:一定要加上Before("bean(**类名**)"),否则不会工作

/**
 * 通知(切入点)
 * @Before("bean(userServiceImpl)")
 * 在切入点之前执行:userServiceImpl对象的全部方法之前执行
 */

备注一下:{}是函数的占位符

Spring AOP 切面,可以用这个东西举一反三

@Before//方法执行之前

@After//方法执行之后,无论是否有异常都会执行

@AfterReturning//方法正常结束后执行

@AfterThrowing//方法异常时之后执行

这四种都可以接收joinpoint连接点,都代表被调用的方法

                                                                                完结!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Spring Boot可以基于AOP实现指定切面的拦截处理。AOP(面向切面编程)是一种编程范式,可以将与业务逻辑无关的横切关注点(如日志记录、安全控制、性能统计等)通过切面的方式进行集管理。 在Spring Boot,可以通过在切面类上使用`@Aspect`注解来标识一个类为切面类,通过在切面类的方法使用不同的注解(如`@Before`、`@After`、`@Around`等)来指定不同类型的切点拦截处理。 例如,我们可以定义一个切面类`LogAspect`,用于记录所有控制层方法的执行时间和返回结果: ```java @Aspect @Component public class LogAspect { private static final Logger logger = LoggerFactory.getLogger(LogAspect.class); @Around("execution(* com.example.myapp.controller..*.*(..))") public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object result = joinPoint.proceed(); long endTime = System.currentTimeMillis(); long executionTime = endTime - startTime; logger.info("{} executed in {} ms, returned: {}", joinPoint.getSignature(), executionTime, result); return result; } } ``` 在上述代码,`@Aspect`注解标识了`LogAspect`类为切面类,`@Around`注解指定了要拦截的切点为`com.example.myapp.controller`包下的所有方法,`logExecutionTime()`方法用于记录方法的执行时间和返回结果,并将日志输出到控制台。 当控制层的方法被调用时,如果方法的签名匹配到了切点表达式,那么`LogAspect`类对应的切面方法(如`logExecutionTime()`)就会被执行,从而实现了对方法的拦截处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值