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@Componentpublic 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 中事务流传个性

如果有嵌套事务时:应该将注解放在事务中: