zoukankan      html  css  js  c++  java
  • springboot 引入AOP 切面 @Aspect 注解使用

     

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

      

     */
    @Aspect
    @Component
    @Slf4j
    public class HttpAspect {
    
        /**
         * 日志切点
         */
        @Pointcut("execution(public * com.api.controller..*.*(..))")
        public void log() {
        }
    
        /**
         * 开始请求前
         *
         * @param joinPoint
         */
        @Before("log()")
        public void doBefore(JoinPoint joinPoint) {
            // 主类
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if (attributes != null){
              HttpServletRequest request = attributes.getRequest();
              // url 路径
              log.info("请求={}", request.getRequestURL() + " | method=" + request.getMethod() + " | ip=" + request.getRemoteAddr());
              // 类方法
              log.info("方法={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
              // 参数
              log.info("参数={}", Arrays.toString(joinPoint.getArgs()));
            }
        }
    
        /**
         * 返回处理
         *
         * @param result
         */
        @AfterReturning(returning = "result", pointcut = "log()")
        public void doAfterReturning(Object result) {
    
            log.info("返回={}", JSON.toJSON(result));
        }
    

      

    任何的public方法

    execution(public * *(..))
    

    以set开始的方法

    execution(* set*(..))
    

    定义在cn.freemethod.business.pack.Say接口中的方法

    execution(* cn.freemethod.business.pack.Say.*(..))
    

    任何cn.freemethod.business包中的方法

    execution(* cn.freemethod.business.*.*(..))
    

    任何定义在com.xyz.service包或者其子包中的方法

    execution(* cn.freemethod.business..*.*(..))
    

    其他表达式

    任何在com.xyz.service包中的方法

    within(com.xyz.service.*)
    

    任何定义在com.xyz.service包或者其子包中的方法

    within(com.xyz.service..*)
    

    任何实现了com.xyz.service.AccountService接口中的方法

    this(com.xyz.service.AccountService)
    

    任何目标对象实现了com.xyz.service.AccountService的方法

    target(com.xyz.service.AccountService)
    

    一般情况下代理类(Proxy)和目标类(Target)都实现了相同的接口,所以上面的2个基本是等效的。

    有且只有一个Serializable参数的方法

    args(java.io.Serializable)
    

    只要这个参数实现了java.io.Serializable接口就可以,不管是java.io.Serializable还是Integer,还是String都可以。

    目标(target)使用了@Transactional注解的方法

    @target(org.springframework.transaction.annotation.Transactional)
    

    目标类(target)如果有Transactional注解中的所有方法

    @within(org.springframework.transaction.annotation.Transactional)
    

    任何方法有Transactional注解的方法

    @annotation(org.springframework.transaction.annotation.Transactional)
    

    有且仅有一个参数并且参数上类型上有Transactional注解

    @args(org.springframework.transaction.annotation.Transactional)
    

    注意是参数类型上有Transactional注解,而不是方法的参数上有注解。

    bean的名字为tradeService中的方法

    bean(simpleSay)
    

    bean名字为simpleSay中的所有方法。

    bean名字能匹配

    bean(*Impl)
    

    bean名字匹配*Impl的bean中的所有方法。

  • 相关阅读:
    Public Sale(巴什博弈)
    Harmonic Value Description (思维+找规律)
    放苹果+N的划分(青理工校赛J题) (动归)
    线段树求逆序数+北化校赛D题
    写给自己
    Euclid's Game (博弈论)
    Bear and Blocks (dp+思维)
    Maximum splitting(找规律+思维)
    Bone Collector II(DP+第K优解)
    Codeforces 950E Data Center Maintenance ( 思维 && 强连通分量缩点 )
  • 原文地址:https://www.cnblogs.com/ampl/p/14915061.html
Copyright © 2011-2022 走看看