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){
    
        }
    
    }
  • 相关阅读:
    c++ 迷宫问题
    linux下恢复删除的文件
    c++ 分解数2
    c++ 平分石头
    多态
    设计模式中类的6种关系
    工厂方法模式
    设计原则之面向接口编程
    封装、继承
    便利构造器、单件模式
  • 原文地址:https://www.cnblogs.com/lwdmaib/p/9915782.html
Copyright © 2011-2022 走看看