AOP知识点

AOP,面向切面编程。通过预编译方式和运行时动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

AOP编程思想就是把很多类对象中的横切问题点,从业务逻辑中分离出来,减少代码的冗余和降低模块间的耦合度,提高开发效率。

简单说就是:把程序里重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对已有方法进行增强。常用于日志记录、事务处理、权限验证等等。

AOP的核心原理

Spring AOP就是基于动态代理的,通过JDK动态代理或CGLib代理在运行时期在对象初始化阶段织入代码的。如果要代理的对象,实现了某个接口,那么AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象, AOP会使用CGLib生成一个被代理对象的子类来作为代理。

AOP中主要概念理解

  • aspect:切面,切面由切点和通知组成,即包括横切逻辑的定义也包括连接点的定义;
  • pointcut:切点,每个类都拥有多个连接点,可以理解是连接点的集合;
  • joinpoint:连接点,程序执行的某个特定位置,如某个方法调用前后等;
  • weaving:织入,将增强添加到目标类的具体连接点的过程;
  • advice:通知,织入到目标类连接点上的一段代码,就是增强到什么地方?增强什么内容?
  • target:目标对象,通知织入的目标类;
  • aop Proxy:代理对象,即增强后产生的对象。

AOP五种通知工作

  • 前置通知:在目标方法调用之前执行,可以获得切入点信息;
  • 后置通知:在目标方法执行后执行,目标方法有异常不执行;
  • 异常通知:在目标方法抛出异常时执行,可以获取异常信息;
  • 最终通知:在目标方法执行后执行,无论是否有异常都执行;
  • 环绕通知:最强大的通知类型,在目标方法执行前后操作,可以阻止目标方法执行。

实现AOP的三种方式

  • 通过Spring API实现;
  • 自定义类来实现AOP;
  • 使用注解实现(常用)。

Spring里执行步骤

1、定义一个切面类Aspect

声明一个切面类,增加@Component和@Aspect两个注解,同时SpringBoot要引入spring-boot-stater-aop依赖包。

2、定义切点Pointcut

定义切点,并定义切点在哪些地方执行,采用@Pointcut注解完成,如@Pointcut(public * com.xxx.xxx.*.*(...))

规则:修饰符(可以不写)+返回类型+包下的类+方法+方法参数 “*”代表不限,“..”两个点代表参数不限,例如:

切点名称myPointcut,在返回类型不限的com.binlog.study.aop.controller包下的所有类,所有方法并且参数不限。

参考:@Pointcut(value="execution(* com.binlog.study.aop.controller.*.*(..))")

3、定义Advice通知

利用通知的5种类型注解@Before、@After、@AfterReturning、@AfterThrowing、@Around来完成在某些切点的增强动作。

使用Spring实现AOP

1、创建一个新的springboot工程,然后添加依赖包:

<!--AOP依赖包-->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId>
</dependency>

2、分别创建两个包,一个是aspect和controller。

3、controller包里创建一个普通访问类AopUserController,代码如下:

import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/api/aop")
public class AopUserController {@GetMapping("/getUserByName")public String name(@RequestParam("name") String name) {return "Hello:" + name;}@GetMapping("/getUserList")public List<String> getUser() {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");return list;}
}

4、aspect包里创建日志切面类AopLog,代码如下:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
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;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component
public class AopLog {private Logger logger = LoggerFactory.getLogger(this.getClass());ThreadLocal<Long> startTime = new ThreadLocal<>();//定义切点@Pointcut(value = "execution(* com.binlog.study.aop.controller.*.*(..))")public void aopWebLog() {}//使用环绕通知@Around("aopWebLog()")public Object myLogger(ProceedingJoinPoint pjp) throws Throwable {startTime.set(System.currentTimeMillis());//使用ServletRequestAttributes请求上下文获取方法更多ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String className = pjp.getSignature().getDeclaringTypeName();String methodName = pjp.getSignature().getName();//使用数组来获取参数Object[] array = pjp.getArgs();ObjectMapper mapper = new ObjectMapper();//执行函数前打印日志logger.info("调用前:{}:{},传递的参数为:{}", className, methodName, mapper.writeValueAsString(array));logger.info("URL:{}", request.getRequestURL().toString());logger.info("IP地址:{}", request.getRemoteAddr());//调用整个目标函数执行Object obj = pjp.proceed();//执行函数后打印日志logger.info("调用后:{}:{},返回值为:{}", className, methodName, mapper.writeValueAsString(obj));logger.info("耗时:{}ms", System.currentTimeMillis() - startTime.get());return obj;}
}

5、项目启动后,浏览器页面访问:

(1)http://localhost:8060/api/aop/getUserByName?name=张三

控制台输出结果:

(2)http://localhost:8060/api/aop/getUserList

控制台输出结果:

至此一个简单的日志记录就完成了。平时开发里还需根据业务进行优化或补充!

【Spring学习】AOP实现日志记录相关推荐

  1. 【Spring】AOP实现日志记录

    我的aop记录日志,可以记录:[ 操作类型.操作描述.参数.登录项目的用户ip] 当然记录什么靠你自己决定. 一.自定义一个注解 @Target({ElementType.METHOD,Element ...

  2. Spring AOP的日志记录

    现在的项目是Spring+MyBatis,前段时间项目经理让我干了一个活,就是给所有的controller里的所有方法加上日志记录的代码,其实没有多少,也就300来个方法,也没有抱怨什么,一边打着瞌睡 ...

  3. Spring Boot自定义注解+AOP实现日志记录

    访问Controller打印的日志效果如下: *********************************Request请求*********************************** ...

  4. 自定义注解-aop实现日志记录

    关于注解,平时接触的可不少,像是 @Controller.@Service.@Autowried 等等,不知道你是否有过这种疑惑,使用 @Service 注解的类成为我们的业务类,使用 @Contro ...

  5. 基于Spring Boot配置文件的日志记录示例样本

    我们希望在Spring Boot中为不同的配置文件使用不同的日志记录配置,例如在本地运行中,我们只希望控制台日志记录和用于生产,我们希望文件记录日志支持每天滚动日志文件. 我想出了一个示例logbac ...

  6. 基于Spring Boot Profile的日志记录示例样本

    我们希望在Spring Boot中为不同的配置文件使用不同的日志记录配置,例如在本地运行中,我们只希望控制台日志记录和用于生产,我们希望文件记录日志支持每天滚动日志文件. 我提出了一个示例logbac ...

  7. java aop注解日志记录_springMVC自定义注解,用AOP来实现日志记录的方法

    需求背景 最近的一个项目,在项目基本完工的阶段,客户提出要将所有业务操作的日志记录到数据库中,并且要提取一些业务的关键信息(比如交易单号)体现在日志中. 为了保证工期,在查阅了资料以后,决定用AOP+ ...

  8. Guice+aopalliance实现Aop之 日志记录

    前言 由于我们开发中经常需要手动写请求参数以及方法的返回值打印 每个都写显得很繁琐所以今天我们主要使用Guice的注解注入对象功能以及加上aopalliance 的动态代理实现请求参数和响应参数的日志 ...

  9. 【Spring Boot】Spring Boot Logging 示例 | 日志记录

    文章目录 logging.level | 设置日志级别 logging.file | 指定输出日志文件的路径和名称 logging.path | 指定输出日志文件的路径 logging.pattern ...

最新文章

  1. r语言 not enough x observations_R基础知识
  2. python剑指offer替换空格_02_替换空格【python】
  3. Apache Hook机制解析(下)——实战:在自己的代码中使用Apache的钩子
  4. 移动端python开发_python前端之移动端库、框架及自动化和优化
  5. Git删除分支/恢复分支
  6. 获取清空textarea的文字内容_运用|你会做 词云图(文字云) 吗?
  7. Python envoy 模块源码剖析
  8. android 广告close,小程序广告弹出与关闭
  9. 笔记本我的计算机怎么找不到了,Win10我的电脑在哪?图标没了怎么办?Win10此电脑不见了解决方法...
  10. 谈谈你对TCP三次握手和四次挥手的理解
  11. php 仿360导航网站源码,仿360网址导航
  12. 利用THINKPHP框架开发的自定义表单及数据字典模板
  13. 李雅普诺夫指数的计算
  14. 易网云授权php,网易云音乐热评api php源码
  15. NoSQL数据库Redis--1
  16. 万字长文:复盘 8 年副业经历,耗时一周,我总结出了独特的「复利思维复业赚钱法」,不看后悔...
  17. 报错“The C compiler identification is unknown……”解决办法
  18. 迅捷无线路由器虚拟服务器,迅捷无线路由器怎么设置 迅捷无线路由器设置步骤【详解】...
  19. python时间函数纳秒_python 纳秒
  20. picker多选 vant_Vant picker 多级联动操作

热门文章

  1. 虚拟化在防泄密领域的缺点
  2. 尼龙毛柱分离T细胞法操作指南
  3. 了解CSS属性font-kerning,font-smoothing,font-variant
  4. 幼儿园实时监测控制系统的设计
  5. 笔记本计算机工作站,笔记本篇:惠普ZBook G3工作站_Intel笔记本电脑_笔记本评测-中关村在线...
  6. QQ空间最新免费个人形象设置方法
  7. eclipse官网32位下载地址
  8. LABVIEW 虚拟键盘 触摸键盘 中英文输入 支持WIN10 WIN7
  9. 【架构师】零基础到精通——网关详解
  10. 给南京沁恒芯片公司点个赞