spring boot 入门3 如何在springboot 上使用AOP

Posted liuwd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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){

    }

}

 

以上是关于spring boot 入门3 如何在springboot 上使用AOP的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot快速入门:使用MyBatis(注解形式)进行数据库操作

如何结合 Spring Boot HornetQAutoConfiguration 和 CachingConnectionFactory?

Spring Boot 持续更新中...

spring boot 入门3 如何在springboot 上使用AOP

JAVA入门[3]—Spring依赖注入

spring boot 系列之三:spring boot 整合JdbcTemplate