zoukankan      html  css  js  c++  java
  • spring boot 入门3 如何在springboot 上使用AOP

    Aop是spring的两大核心之一

    那么如何在springboot中采用注解的形式实现aop那?

    1)首先我们定义一个相关功能的切面类 并 采用@Aspect 注解来声明当前类为切面 同时采用@Component 注解将当前类交与spring管理

    @Aspect
    @Component
    public class HttpAspect {}

    2)定义切点 声明一个方法将在方法上采用@Pointcut

      /**
         *  定义一个方法  为切点  统一的切入方法点
         */
        @Pointcut(value = "execution(public * com.lwd.web.LoginController.*(..))")
        public void log(){
    
        }

    3) 声明增强方法

        /**
         *  采用统一切入点进行增强  切入的方法 执行之前进行切入
         */
        @Before("log()")
        public void login(){
            System.out.println("----------ddddddddddddd----------------");
        }
     /**
         *  切入的方法执行完成之后执行
         */
        @After("log()")
        public void  doAfter(){
            System.out.println("777777777777777777777777");
        }
    
        @Before("log()")
        public void doAfterReturning(JoinPoint joinPoint){
    
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = requestAttributes.getRequest();
            //url
            String requestURI = request.getRequestURI();
            logger.info("url={}",requestURI);
            //method
            String method = request.getMethod();
            logger.info("method=",method);
            //ip
            //类方法
            Signature signature = joinPoint.getSignature();
            String declaringTypeName = signature.getDeclaringTypeName();
            String name = signature.getName();
    
            Object[] args = joinPoint.getArgs();
        }
        //如何在做切面的时候获取切点的返回数据内容
        @AfterReturning(returning = "object",pointcut = "log()")
        public void doAfterReturning(Object object){
    
        }

    具体代码实现方式:

    package com.lwd.aspect;
    
    
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestAttributes;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    
    
    /**
     * 1.定义了一个切面类 @Aspect 注解  @Component 注解
     * 2.定义切点  声明一个方法 添加@Pointcut 注解 execution表达式来声明切入的点
     * 3.定义 增强  @befor  @after  @AfterReturning 等一系列注解来进行增强
     * Created by andyliu on 2018/11/5.
     */
    
    @Aspect
    @Component
    public class HttpAspect {
    
        private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class);
    
        /**
         *  这样试用于对指定方法进行增强  或者 对所有方法都进行增强 当前表达式只当前增强方法使用
         */
    
        @Before("execution(public * com.lwd.web.LoginController.*(..))")
        public void doBefor(){
           System.out.println("---实现对当前类下的任意方法执行前进行增强----");
        }
    
        /**
         *  定义一个方法  为切点  统一的切入方法点
         */
        @Pointcut(value = "execution(public * com.lwd.web.LoginController.*(..))")
        public void log(){
    
        }
    
        /**
         *  采用统一切入点进行增强  切入的方法 执行之前进行切入
         */
        @Before("log()")
        public void login(){
            System.out.println("----------ddddddddddddd----------------");
        }
    
        /**
         *  切入的方法执行完成之后执行
         */
        @After("log()")
        public void  doAfter(){
            System.out.println("777777777777777777777777");
        }
    
        /**
         *  获取http请求
         * @param joinPoint
         */
        @Before("log()")
        public void doAfterReturning(JoinPoint joinPoint){
           //requestContextHolder   request reponse 控制器
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            //获取httpServlerRequst请求
            HttpServletRequest request = requestAttributes.getRequest();
            //url
            String requestURI = request.getRequestURI();
            logger.info("url={}",requestURI);
            //method
            String method = request.getMethod();
            logger.info("method=",method);
            //ip
            String remoteAddr = request.getRemoteAddr();
            //类方法
            Signature signature = joinPoint.getSignature();
            String declaringTypeName = signature.getDeclaringTypeName();
            String name = signature.getName();
    
            Object[] args = joinPoint.getArgs();
        }
        //如何在做切面的时候获取切点的返回数据内容
        @AfterReturning(returning = "object",pointcut = "log()")
        public void doAfterReturning(Object object){
    
        }
    
    }
  • 相关阅读:
    VB6:从Comctl.dll中加载TREEVIEW并美化OCX版本(修正)
    一个围猫的小游戏
    从RES文件中直接加载JPG的函数
    Vistaform Control v1.40正式发布(下载)
    比CopyMemory还要快的函数SuperCopyMemory
    VB开发日志:做按钮时顺便做的颜色调整工具
    魔兽按键精灵 V2.0(修正1)
    魔兽按键精灵准备开发3.0版本
    VB高级编程之:完全子类化模仿OFFICE2007按钮
    VB:我的进度条Diy
  • 原文地址:https://www.cnblogs.com/lwdmaib/p/9915782.html
Copyright © 2011-2022 走看看