1. AOP 概述
1.1 AOP 是什么?
AOP(Aspect Orient Programming)是一种设计思维,是软件设计畛域中的面向切面编程,它是面向对象编程 (OOP) 的一种补充和欠缺。它以通过预编译形式和运行期动静代理形式,实现在不批改源代码的状况下给程序动静对立增加额定性能的一种技术。
![image.png](/img/bVbOW0B)
AOP 与 OOP 字面意思相近,但其实两者齐全是面向不同畛域的设计思维。理论我的项目中咱们通常将面向对象了解为一个动态过程(例如一个零碎有多少个模块,一个模块有哪些对象,对象有哪些属性),面向切面的运行期代理形式,了解为一个动静过程,能够在对象运行时动静织入一些扩大性能或管制对象执行。
AOP 就是要基于 OCP(开闭准则),在不扭转原有系统核心业务代码的根底上动静增加一些扩大性能并能够 ” 管制 ” 对象的执行。例如 AOP 利用于我的项目中的日志解决,事务处理,权限解决,缓存解决等等。
![image.png](/img/bVbOW0a)
明:Spring boot2.x 中 AOP 当初默认应用的 CGLIB 代理, 如果须要应用 JDK 动静代理能够在配置文件 (applicatiion.properties) 中进行如下配置:
spring.aop.proxy-target-class=false
2. Spring AOP 疾速实际
2.1 我的项目创立及配置
创立 maven 我的项目或在已有我的项目根底上增加 AOP 启动依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.2 扩大业务剖析及实现
package com.cy.pj.common.aspect;
@Aspect
@Slf4j
@Component
public class SysLogAspect {@Pointcut("bean(sysUserServiceImpl)")
public void logPointCut() {}
@Around("logPointCut()")
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 注解形容的办法参数。
3. Spring AOP 编程加强
在基于 Spring AOP 编程的过程中,基于 AspectJ 框架规范,spring 中定义了五种类型的告诉(告诉形容的是一种扩大业务),它们别离是:
- @Before。
- @AfterReturning。
- @AfterThrowing。
- @After。
- @Around. 重点把握(优先级最高)
总结:
1.AOP 是一种设计思维(面向切片编程),实现在不批改源代码的状况下给程序
动静对立增加额定性能的一种技术;
2.AOP 和 OOP 区别:但其实两者齐全是面向不同畛域的设计思维。理论我的项目中咱们
通常将面向对象了解为一个动态过程(例如一个零碎有多少个模块,一个模块有哪些对象,对象有哪些属性),面向切面的运行期代理形式,了解为一个动静过程,能够在对象运行时动静织入一些扩大性能或管制对象执行。
AOP 的利用场景:AOP 就是要基于 OCP(开闭准则),在不扭转原有系统核心业务代
码的根底上动静增加一些扩大性能并能够 ” 管制 ” 对象的执行。例如 AOP 利用于我的项目中的日志解决,事务处理,权限解决,缓存解决等等。
AOP 的应用步骤:首先增加 jar 文件;
1. 类上增加注解:@Aspect,@Commpent,@Slf4j(须要日志的时候增加)
2. 在类中增加切入点:两种形式:@Pointcut(“bean(sysLogServiceImpl)”),
@Pointcut(“@annotation(类全名)”)
3.@annotation 作为注解切入点形式的步骤:
(1). 在另外一个类下面增加一个注解
(2). 在切面类上应用切面和 Around 形式增加缓存:
(3)应用注解在特指的办法下面:
4. 增加一个载体办法;
5. 通过“五种告诉”:@Around,@Before,@After,@After,@AfterReturning,@AfterThrowing, 执行程序是:
6.Around 盘绕告诉应用留神:
3. 切面优先级设置实现
4. Spring AOP 事务处理
4.12. Spring 中事务管理实现
步骤:
1. 增加注解::@Transactional
2. 注解:@Transactional (参数):
<1>Timeout: 默认是:-1,示意事务执行时的超时工夫:- 1 示意没有超时工夫;
<2>read-only:(示意只读类型):默认是 false(读取全副), 设置为 true 的话,是指只能进行查问业务;
<3>.rollback-for:用于指定回滚的触发异样类型,如果有多个异样类型的话,能够加逗号分隔;
<4>.no-rollback-for: 抛出 no-rollback-for 指定的异样类型,不进行回滚;
<5>.isolation: 务的隔离级别,默认值采纳 DEFAULT。当多个事务并发执行时,可能会呈现脏读,不可反复读,幻读等景象时,但如果不心愿呈现这些景象可思考批改事务的隔离级别(但隔离级别越高并发就会越小,性能就会越差)
留神:
- 当 @Transactional 注解利用在类上时示意类中所有办法启动事务管理,并且个别用于事务共性的定义。
- 当 @Transactional 形容办法时示意此办法要进行事务管理,如果类和办法上都有 @Transactional 注解,则办法上的事务个性优先级比拟高。
2.3. spring 中事务流传个性
如果有嵌套事务时:应该将注解放在事务中: