zoukankan      html  css  js  c++  java
  • Spring Boot笔记九:AOP面向切面编程

    我参考的这篇文章,以验证身份为例讲解了什么是AOP AOP

    这里只讲解一下怎么去实现AOP

    新建一个类,叫HttpAspect用来切面

    package com.vae.springboot.study.aspect;
    
    import jdk.nashorn.internal.ir.RuntimeNode;
    import org.aspectj.lang.annotation.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    import javax.servlet.http.HttpServletRequest;
    
    @Aspect
    @Component
    public class HttpAspect {
    
        //日志
        Logger logger=LoggerFactory.getLogger(getClass());
        private RuntimeNode attributes;
        
        @Pointcut("execution(public * com.vae.springboot.study.Controller.HelloController.*(..))")
        public void log(){ }
    
        @Before("log()")
        public void doBefore(){
            ServletRequestAttributes attributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request=attributes.getRequest();
    
            logger.info("假装我在这里验证了用户身份");
            //url
            logger.info("url={}",request.getRequestURI());
            //方法
            logger.info("method={}",request.getMethod());
            //ip
            logger.info("ip={}",request.getRemoteAddr());
            //类方法
            //logger.info("class_method={}",joinPoint.getSignature());
            //参数
            //logger.info("arg={}",joinPoint.getArgs());
        }
        @After("log()")
        public void doAfter(){
            logger.info("假装我在这里处理最后的事情");
        }
    }
    
    

    这里面需要讲的东西就是@Aspect注解

    @Aspect

    作用是把当前类标识为一个切面供容器读取

    @Before
    标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有

    @AfterReturning

    后置增强,相当于AfterReturningAdvice,方法正常退出时执行

    @AfterThrowing

    异常抛出增强,相当于ThrowsAdvice

    @After

    final增强,不管是抛出异常或者正常退出都会执行

    @Around

    环绕增强,相当于MethodInterceptor

    @DeclareParents

    引介增强,相当于IntroductionInterceptor

    看一下我们的Controller

    package com.vae.springboot.study.Controller;
    
    import com.vae.springboot.study.bean.Person;
    import org.springframework.stereotype.Controller;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.validation.Valid;
    import java.util.Map;
    
    @Controller
    public class HelloController {
    
        @PostMapping("/test")
        public String test(@Valid Person person, BindingResult bindingResult){
            System.out.println("test方法");
            if (bindingResult.hasErrors()) {
                System.out.println(bindingResult.getFieldError().getDefaultMessage());
                return null;
            }
            person.setName(person.getName());
            person.setAge(person.getAge());
            return "Vae";
        }
    
    
    }
    
    

    运行,然后使用PostMan执行一下http://localhost:8080/test

  • 相关阅读:
    Win10如何关闭自动更新服务
    Windows10 【系统周期表】【系统下载表】【大型软件表】
    Win10如何设置开机自动登录
    Win10《芒果TV》发布两周年纪念特别献礼,陪你度国庆,好礼送不停
    Win10《芒果TV》商店版更新v3.7.0卡牌版:为小冰生日献礼,为秋季创意者更新铺路
    Win10《芒果TV
    Win10《芒果TV》更新v3.6.0秋收版:新增追剧磁贴、记忆续播、跳转列表
    Win10《芒果TV》更新v3.5.2星玥版:修复电视台直播异常,优化添加下载提示
    Win10《芒果TV》更新v3.5.0夏至版:会员尊享蓝光画质,关联本地视频播放
    [Cocos2d-x for WP8学习笔记] 获取系统字体
  • 原文地址:https://www.cnblogs.com/yunquan/p/10355972.html
Copyright © 2011-2022 走看看