Spring AOP - AspectJ
发布日期:2021-06-30 17:03:56 浏览次数:2 分类:技术文章

本文共 2534 字,大约阅读时间需要 8 分钟。

springboot

org.springframework.boot
spring-boot-starter-aop

AOP

package com.cy.myblog.controller.aspect;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;import lombok.extern.slf4j.Slf4j;@Slf4j@Aspect@Componentpublic class SysLogAspect {
@Pointcut("execution(* com.cy.myblog.service.*.*(..))") public void doLog() {
} @Before("doLog()") public void doBefore() {
log.info("######### doBefore #########"); } @Around("doLog()") public Object doRound(ProceedingJoinPoint jp ) throws Throwable {
try {
log.info("######### doRound - before #########"); Object result = jp.proceed(); log.info("######### doRound - after #########"); return result ; } catch (Throwable e) {
log.info("######### doRound - exception #########"); throw e ; } finally {
log.info("######### doRound - finally #########"); } } @After("doLog()") public void doAfter() {
log.info("######### doAfter #########"); } @AfterReturning(pointcut = "doLog()" , returning = "result") public Object doAfterReturn(Object result) {
log.info("######### doAfterReturn:resutl=[{}] #########", result); return result ; } @AfterThrowing(pointcut = "doLog()" , throwing = "e") public void doAfterThrowing(Exception e) {
log.info("######### doAfterThrowing:exception=[{}] #########", e.getMessage()); } }

AOP 概念

  • 通知(Advice)

    指切面(定义为aspect的类)中的工作;

  • spring切面可以应用的五种通知:

    • 前置通知(Before):在目标方法被调用之前调用通知功能;
    • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
    • 返回通知(After-returning):在目标方法成功执行之后调用通知;
    • 异常通知(After-throwing):在目标方法抛出异常后调用通知;
    • 环绕通知(Around):通知报过了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
  • 连接点(Join point)

    连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。(切点方法中配置的匹配的方法都是连接点)

  • 切点(Pointcut)

    定义通知所要织入的一个或多个连接点。

  • 切面(Aspect)

    是通知和切点的结合。


切面获取请求信息

如果要获取 request 或者 response

@GetMapping(value = "")public String center() {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = servletRequestAttributes.getRequest(); HttpServletResponse response = servletRequestAttributes.getResponse(); //...}

转载地址:https://lawsssscat.blog.csdn.net/article/details/104753149 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:SpringBoot - MappingJackson2HttpMessageConverter 功能增强:添加 jsonp 请求响应(新)
下一篇:Spring Boot:处理跨域请求(cors、jsonp、websocket) 【未完】

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年05月03日 00时45分52秒