springboot 的aop应用详解与可运行demo

springboot的aop思想

aop是一种编程范式不是一种编程语言,支持aop的语言有很多种,今天主要介绍下springboot中aop的简单。

spring AOP的使用
1.我们先创建一个controller方法
2.其次我们还得导入aop的相关类
compile 'org.aspectj:aspectjtools:1.8.1'
3.然后我们需要认识几个aop的注解
@Aspect:这个注解告诉spring容器,我这个类是主要就是来做aop管理的,可能会横切某个方法,在运行方法之前先运行这个
被注解的方法。
@Component:组件,就是要将这个类当作组件放进spring容器中,在实例化对象的时候会将这个类当作组件实例化到spring容器中

要学习AOP还得知道几个关键点,切点,切入的时间
我们通常用@Pointcut来设置切点,切点可以是方法,类,参数,关键看自己想怎么切

切入时间大致分为一下几个时间点:
@Before
@Around
@After
@AfterReturning
...
这个具体的用法看aopTest中的应用

@AfterReturning 后置返回可以获取返回的结果
@AfterReturning(returning = "ret", pointcut = "log()")
public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        logger.info("RESPONSE : " + ret);
    }


之后我们还需要看一个第三方类,JoinPoint
这个对象可以获取很多请求的属性,具体看源码:参数,类方法....

到此,我们的aop运用就大致结束,具体还是要知道aop的特性来决定它的应用。

 

import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(value = "/hello")
public class aopTestController {

  @ResponseBody
  @GetMapping(value = "/world")
  public String aopTest(@RequestParam String name){
    return "hello"+name;
  }

}
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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 AopTest {
 
    private static final Logger logger = Logger.getLogger(AopTest.class);   //日志,我用的log4j
 
    //配置切点
    @Pointcut("execution(* com.sso.controller..*(..))")
    public void log() {
    }
 
    @Before("log()")  //前置通知
    public void beforeExcution(JoinPoint joinPoint) {
        ServletRequestAttributes Attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = Attributes.getRequest();

        //url
        logger.info("URL:"+request.getRequestURL());
        //method
        logger.info("method:"+request.getMethod());
        //ip
        logger.info("ip:"+request.getRemoteAddr());
        //port
        logger.info("port:"+request.getRemotePort());
        //类方法
        logger.info("class_method:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
        //参数
        logger.info("args:"+joinPoint.getArgs());

    }
 
    @AfterReturning(returning = "ret", pointcut = "log()")  //后置返回
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        logger.info("RESPONSE : " + ret);
    }
}

 

我会将我大学到现在所有学的知识,构建在一个github项目中,需要和有类似想法的同学可以和我一起学习进步,谢谢支持,可以点赞加关注吗,持续维护博客ing。github地址:https://github.com/xianglong123/xlSSO.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值