SpringAOP

Spring的核心功能其一AOP介绍

AOP:面向切面编程。简单的说,我们在写代码的时候是纵向的,由上至下,但是如果我们的核心功能代码开发完成以后,想要添加一些非核心的业务逻辑,就要用到Spring的另一核心功能了,AOP面向切面编程。简单的说,就是利用Spring帮我们封装了一个可以直接横切入我们写好的代码来实现功能(完善功能).

AOP的应用场景

  1. **参数校验:**在接受参数层,对传递的参数进行校验,不满足直接不允许运行一下的逻辑;
  2. **记录日志:**对方法进行日志的打印 ;
  3. 记录执行时间: 日志记录打印方法执行时间,以备日后分析 ;
  4. 事务的管理: 调用方法前开启,结束后关闭事务;

参数校验功能

步骤一:添加相关依赖

    <-- springboot 项目,加入aop的jar依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

步骤二:编写切面类

@Aspect   // 切面类注解
@Component // 交给ioc容器管理
public class LogAOP {
	// 日志对象
    private static final  Logger log = LoggerFactory.getLogger(LogAOP.class);
	
    // 切点定义 就是我要在系统的哪个方法去切入实现我的日志和校验参数
    @Pointcut("execution
      (public * com.springbootpro.springbootmybaties.controller.*.*(..))")
    public void userController(){} 
	
    // 环绕通知来做日志和参数校验 括号内是本类中定义的方法名
    @Around("userController()")
    public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        log.info("环绕通知前");
        Signature signature = proceedingJoinPoint.getSignature();
        String name = signature.getName();   // 获取方法名
        Object[] args = proceedingJoinPoint.getArgs(); //获取请求参数
        String string = JSON.toJSONString(args);
        log.info("请求方法是{},参数是{}",name,string);
        //获取 请求信息 转型serverlet请求属性  是springMVC的获取所有请求信息的类
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest(); //获取request
        StringBuffer requestURL = request.getRequestURL();  //获取请求url
        String method = request.getMethod();        // 获取请求方式
        String remoteAddr = request.getRemoteAddr();    //获取远程请求地址IP
        log.info("请求url{}",requestURL);
        log.info("请求方式{}",method);
        log.info("请求的真实ip{}",remoteAddr);
        if ((int)args[0]==2){   //简单校验参数
            return "你好啊 你这参数有误啊";
        }
        Object proceed = proceedingJoinPoint.proceed(); // 方法执行体  以上是环绕前 下边是环绕后
        log.info("环绕通知后");
        // proceed是方法返回值
        return proceed;
    }

}

被切入的controller层编写;

    @RestController
    public class UserController {

        @RequestMapping("/test")
        public String asd(int a,int b,int c){
            System.out.println("asd方法执行了"+ a);
            return "hello";
        }
    }

SpringAOP的实现原理##

SpringAOP两种实现的模式:
1.JDK动态代理
2.Cglib动态代理
具体的实现细节,也不是很了解,看过源码,不过又忘记了。。。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值