Spring AOP 简介

user_dJ2Bu5fI 2020-11-19 18:26:11
java spring AOP SegmentFault 简介


1 AOP概述

AOP是什么:

AOP(Aspect Orient Programming)是一种设计思想,是软件设计领域的面向切面编程。简单来说,就是在不修改源码的情况下,增添业务扩展功能的一种技术。

与OOP之间的区别,AOP是在运行期、动态的植入功能或控制对象执行,而OOP主要对象是静态的。

原理分析:

1) 假如目标对象(被代理对象)实现接口,则底层可以采用 JDK 动态代理机制为目标对象创建代理对象(目标类和代理类会实现共同接口)。

2) 假如目标对象(被代理对象)没有实现接口,则底层可以采用 CGLIB 代理机制为目标对象创建代理对象(默认创建的代理类会继承目标对象类型)。

image

Spring 中 AOP 相关术语分析

  • 目标类:我们需要扩展功能业务的对象。

切面(aspect): 横切面对象,一般为一个具体类对象(可以借助@Aspect 声明)。

通 知 (Advice): 在 切 面 的 某 个 特 定 连 接 点 上 执 行 的 动 作 ( 扩 展 功 能 ) , 例 如
around,before,after 等。

连接点(joinpoint):程序执行过程中某个特定的点,一般指向被拦截到的目标方法。

切入点(pointcut):对多个连接点(Joinpoint)一种定义,一般可以理解为多个连接点的集合。

image

2 Spring AOP 快速实践

maven配置:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter- aop</artifactId>
</dependency>

说明:基于此依赖spring可以整合AspectJ框架快速完成AOP的基本实现。AspectJ
是一个面向切面的框架,他定义了 AOP 的一些语法,有一个专门的字节码生成器来生成遵
守 java 规范的 class 文件。

创建切面类对象:

package com.cy.pj.common.aspect;
@Aspect
@Slf4j
@Component
public class SysLogAspect {
@Pointcut("bean(sysUserServiceImpl)")
public void doLogPointCut() {}
@Around("doLogPointCut()")
public Object around(ProceedingJoinPoint jp)
throws Throwable{
try {
log.info("start:{}"+System.currentTimeMillis());
Object result=jp.proceed();//最终会调用目标方法
log.info("after:{}"+System.currentTimeMillis());
return result;
}catch(Throwable e) {
log.error("after:{}",e.getMessage());
throw e;
}
}
}

@Aspect 注解用于标识或者描述 AOP 中的切面类型,基于切面类型构建的对象用于为目标对象进行功能扩展或控制目标对象的执行。

@Pointcut 注解用于描述切面中的方法,并定义切面中的切入点(基于特定表达式的方式进行描述),在本案例中切入点表达式用的是 bean 表达式,这个表达式以 bean开头,bean 括号中的内容为一个 spring 管理的某个 bean 对象的名字

@Around 注解用于描述切面中方法,这样的方法会被认为是一个环绕通知(核心业务方法执行之前和之后要执行的一个动作),@Aournd 注解内部 value 属性的值为
一个切入点表达式或者是切入点表达式的一个引用(这个引用为一个@PointCut 注解描述的方法的方法名)。

ProceedingJoinPoint 类为一个连接点类型,此类型的对象用于封装要执行的目标方法相关的一些信息。只能用于@Around 注解描述的方法参数。

版权声明
本文为[user_dJ2Bu5fI]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000038228658

  1. Java Stream入门知识讲解
  2. 系统日历 插入重复事件规则 (android/java)
  3. iOS MJRefresh的使用方式
  4. (一)Java版Spring Cloud B2B2C o2o鸿鹄云商平台--概述
  5. 技术分享 | MySQL binlog 压缩功能对性能的影响
  6. MySQL collapse 12: the principle and application of join query
  7. Bald, 23 pictures show you how to start spring boot from the source code~
  8. Linux cloud service builds 7-day killing server
  9. Python practical GUI interface + MySQL
  10. Docker production container communication
  11. MySQL tuning starts with writing SQL
  12. Docker image
  13. [MySQL] MySQL optimization instance
  14. 2W + long article takes you to analyze concurrent HashMap ~!
  15. . net5 is here, and you don't know how to deploy it to Linux? There is always one for you
  16. Basic operation of MySQL
  17. Python3 connected to mysql8
  18. My open source experience: a Java framework for handling three-party HTTP interfaces
  19. Sharding JDBC, a sub database and sub table artifact, with tens of millions of data, don't you do it?
  20. Transaction of spring source code (1) - automatic configuration of transaction autoconfiguration
  21. Using JavaScript to manipulate browser history API
  22. Introduction to Java stream
  23. (1) Java version of spring cloud b2b2b2c o2o Honghu cloud business platform -- Overview
  24. Technology sharing | impact of MySQL binlog compression function on Performance
  25. System calendar insert duplicate event rule (android/java)
  26. How to use IOS mjrefresh
  27. Java Stream入门知识讲解
  28. Java中的序列化与反序列化
  29. java中elasticsearch7.x关于nested类型的api使用,新增+更新
  30. JavaScript异步编程
  31. java中各类对象的含义(pojo/vo/po/do/bo/qo....)
  32. Netty4源码解读-EventLoop篇
  33. SpringBoot第十一集:整合Swagger3.0與RESTful介面整合返回值(2020最新最易懂)
  34. Java stream introduction
  35. JavaScript asynchronous programming
  36. The meaning of various objects in Java (POJO / VO / PO / do / Bo / Qo...)
  37. Spring之BeanUtils实现原理解析
  38. 技术分享 | 客户端连接 MySQL 失败故障排除
  39. 看完后,我才明白 Redis 为什么默认 16 个数据库?
  40. Netty4 source code interpretation - EventLoop
  41. Springboot episode 11: integrating swagger 3.0 with restful interface and integrating return values
  42. Docker安装Redis,Spring Boot使用Redis,解决Redis发生的类型转换异常
  43. Analysis of the implementation principle of BeanUtils in spring
  44. Technology sharing | troubleshooting client connection to MySQL
  45. After reading it, I understood why redis defaults to 16 databases?
  46. Serialization and deserialization in Java
  47. Java elasticsearch7. X on the use of nested type API, add + update
  48. 二进制方式安装K8S环境
  49. springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin
  50. MyBatis 底层源码解析 (详细)
  51. MySQL|mysql-索引
  52. 最新Spring Boot 与Spring Cloud版本对应关系
  53. Docker installs redis, and spring boot uses redis to solve the type conversion exception of redis
  54. MySQL | MySQL index
  55. Correspondence between the latest spring boot and spring cloud versions
  56. Installing k8s environment in binary mode
  57. Springboot package error: failed to execute goal org.apache.maven . plugins:maven-resources-plugin
  58. Mybatis underlying source code analysis (detailed)
  59. Java NIO 基础四 选择器
  60. 2w+長文帶你剖析ConcurrentHashMap~!