SpringBoot 使用AOP功能
RPC,AOP都会用到代理,代理的技术有jdk的Proxy代理(必须实现接口),cglib(可以不实现接口,直接实现类),Javassist(jboss )而Spring boot本身也在方方面面使用了代理技术,在Spring中有两种动态代理方式,分别为jdk动态代理和CGLIB动态代理。
下面主要讲述,springboot如何使用AOP功能
1.POM文件中添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.在application.properties中加入配置
spring.aop.auto=true
PS:其实springboot此配置是默认开启的,所以根本可以不用管了,在Springboot中使用过注解配置方式的人会问是否需要在程序主类中增加@EnableAspectJAutoProxy
来启用,实际并不需要。看下面关于AOP的默认配置属性,其中spring.aop.auto
属性默认是开启的,也就是说只要引入了AOP依赖后,其实默认已经增加了@EnableAspectJAutoProxy
。
# AOP
spring.aop.auto=true # Add @EnableAspectJAutoProxy.
spring.aop.proxy-target-class=false # Whether subclass-based (CGLIB) proxies are to be created (true)
此处是设置是否开启CGLIB代理,默认不开启,相当于spring xml中
<aop:aspectj-autoproxy proxy-target-class="true"/>,
不过后面会有点奇怪的问题,springboot中,不管这个项是否设置为true或者false,都不会跟以前spring项目中,
如果没有设置为true,当代理类没有继承接口,启动项目的时候会报错。而springboot项目中,会自动转换成使用
CGLIB进行动态代理,其中原理是怎么实现,就没有去看底层代码了,估计底层进行了改造吧!
3.利用注解方式,实现AOP实现类。
import java.util.Arrays;import javax.servlet.http.HttpServletRequest;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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;@Aspect
@Component
public class WebLogAspect {private Logger logger = LoggerFactory.getLogger(WebLogAspect.class);@Pointcut("execution(public * com.springboot.test.controller.*.*(..))")public void webLog(){System.out.println("begin");}@Before("webLog()")public void doBefore(JoinPoint joinPoint) throws Throwable {// 接收到请求,记录请求内容ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容logger.info("URL : " + request.getRequestURL().toString());logger.info("HTTP_METHOD : " + request.getMethod());logger.info("IP : " + request.getRemoteAddr());logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));}@AfterReturning(returning = "ret", pointcut = "webLog()")public void doAfterReturning(Object ret) throws Throwable {// 处理完请求,返回内容logger.info("RESPONSE : " + ret);}}
测试:
情况1:spring.aop.proxy-target-class=false,实现类没有继承接口。
上图可以说明使用了CGLIB动态代理。这里就可以看出,spring.aop.proxy-target-class好像并没有其效果,这个我都没有去深究了。有谁知道的,请留言一下咯!
情况2:spring.aop.proxy-target-class=false,实现类继承了接口。
上图可以看出使用了jdk动态代理!
情况3:spring.aop.proxy-target-class=true,实现类继承了接口。
上图可以看出使用了CGLIB动态代理。这里就可以看出,spring.aop.proxy-target-class起效果了。
结论:就是不太清楚情况一,为什么不会报错,知道的牛人,可以留言喔!
SpringBoot 使用AOP功能相关推荐
- SpringBoot集成AOP管理日志
写在前面 如何将所有的通过url的请求参数以及返回结果都输出到日志中? 如果在controller的类中每个方法名都写一个log输出肯定是不明智的选择.使用Spring的AOP功能即可完成. AOP ...
- uni中动态加载class_SpringBoot中使用LoadTimeWeaving技术实现AOP功能
1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 AOP--面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强.按切面被织如到目标类中的时间划分,主要有以下几 ...
- SpringBoot的AOP是默认开启的,不需要加注解@EnableAspectJAutoProxy____听说SpringAOP 有坑?那就来踩一踩
@Aspect @Component public class CustomerServiceInterceptor {@Before("execution(public * org.exa ...
- SpringBoot利用Aop打印入参出参日志
SpringBoot利用Aop打印入参出参日志 前言 以前写代码不会用Aop的时候,记录入参出参的日志打印都是在Controller中完成的,每个Controller的方法开始之前先打印个日志,然后方 ...
- SpringBoot之AOP面向切面编程
什么是AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开 ...
- Springboot项目Aop、拦截器、过滤器横向对比
前言 伟人曾经说过,没有调查就没有发言权(好像是伟人说的,不管谁说的,这句话是正确的),有些东西看着简单,张口就来,但很有可能是错的.我个人的经验是,aop.过滤器.拦截器的实现方式很简单,一学就会, ...
- aop springboot 传入参数_java相关:springboot配置aop切面日志打印过程解析
java相关:springboot配置aop切面日志打印过程解析 发布于 2020-3-31| 复制链接 摘记: 这篇文章主要介绍了springboot配置aop切面日志打印过程解析,文中通过示例代码 ...
- 从零开始实现一个简易的Java MVC框架(六)--加强AOP功能
前言 在前面从零开始实现一个简易的Java MVC框架(四)--实现AOP和从零开始实现一个简易的Java MVC框架(五)--引入aspectj实现AOP切点这两节文章中已经实现了AOP功能并且引用 ...
- Spring AOP功能和目标
1.AOP的作用 在OOP中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增加.AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可 ...
最新文章
- 如何利用AI语义分析,做产品需求分析(1)
- JS实现数组去重(重复的元素只保留一个)
- python观察日志(part7)--可变长参数元祖
- 3.eclipse对mysql云数据库编程增删改查
- require.jsAMD模块化编程
- Abp vnext Web应用程序开发教程 9 —— 作者:用户界面
- Android之SwipeRefreshLayout下拉刷新组件
- Python学习-2.安装IDE
- Ubuntu 16.04将ISO镜像写入U盘
- Git版本控制管理(七)--提交和查看提交历史
- 解决百度文档复制时候的vip限制
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制 (转)
- 简单讲讲SQL注入原理防御
- PL/0词法分析程序
- 三相全桥整流电路_什么是三相全波整流电路,三相全波整流电路的工作原理是什么,三相全波整流电路电路图...
- CSP-X模拟题第三套-信心赛题解
- 以树莓派为控制中心的软硬件之开发之脑电波模块
- 灭霸命令、女装大佬...GitHub上那些让你忍不住Star的奇葩项目
- 计算机计算器logo,电脑计算器在哪打开
- 迷宫寻宝(BFS模板题)
热门文章
- Java中List和Map接口之间的区别
- ppython_Python pcom包_程序模块 - PyPI - Python中文网
- mysql 刷新二进制日志_使用binlog日志恢复MySQL数据库删除数据的方法
- git 怎么查看合并过来哪些代码_git整理纷乱的历史合并记录
- docker仓库搭建、加密、用户认证
- 徐州初中计算机学校排名2015,徐州初中学校排名,徐州重点初中排名详细榜单
- ReactNative常用组件汇总
- Kubernetes 部署 Ingress 控制器 Traefik v2.1
- 深入了解EntityFramework——Fluent API
- java clone方法_JAVA对象clone方法代码实例解析