aop即 Aspect-Oriented Programming ,面向切面编程。
- Aspect:切面。在代码的执行过程中,总是有一些逻辑在多个模块中是一样的,这个时候,这些多个处理逻辑一样的地方就可以放在一个地方处理。这种处理就感觉像是在代码的各个模块文件中,横向切开了一刀,插入额一段新的逻辑,这些新逻辑的代码文件像是横叉在所有代码的一个切面,经过这个平面处理之后再回到原有的执行逻辑
- Join Point:公共程序执行的位置,对于spring来说,表示方法的执行(要支持字段的更新可以选择AspectJ)
- Point cut:适配所有Join Point的表达式,用来筛选是和执行公共代码的方法
- Advice:切面中实际执行的代码,它可以在方法执行前、执行后、扔出异常等等的位置
- Target Object:切面执行完后,原始程序需要执行的内容,对于切面来说,这个就是需要它代理要执行的对象
- Advisor:代码实现,负责组织好 Advice/Point cut/要代理的对象 的关系
Aop代码中运用
可以使用xml或者注解的方式在项目中使用aop,以注解为例,一般使用可以引用 AspectJ,自己创建一个类,在类上标注好注解
@Aspect
@Aspect
public class LogAspect {}
复制代码
在xml中开启扫描即可找到这个注解
<aop:aspectj-autoproxy />
复制代码
在代码中建立好对应的
Point Cut
@Pointcut("execution(* paxi.maokitty.verify.spring.aop.service.ExecuteService.*(..))")
public void allClassPointCut(){}
复制代码
这里PointCut表达式指定类paxi.maokitty.verify.spring.aop.service.ExecuteService所有方法都是目标对象
建立自己需要执行的方法(
advice
)
@Before("allClassPointCut()")
public void beforeAspectExecuteService(JoinPoint joinPoint){
LOG.info("beforeAspectExecuteService execute method:{}",new Object[]{joinPoint.getStaticPart().toShortString()});
}
复制代码
即可达到对应的目标,而且这种方式做到了对原有代码的无入侵,体验很好。 完整的可运行实例请戳这里
spring中的事务对aop的使用
事务
此处不讨论分布式事务
事务是数据库执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。当事务被提交给了数据库,数据库需要确保该事务中的所有操作都成功完成并且结果被永远保存在数据库中。如果事务中有的操作没有成功的完成,则事务中的所有操作都需要回滚,回到事务执行前的状态,同时,该事务对数据库的其他事务执行没有影响。数据库事务一般拥有以下四个特性
- 原子性:事务中所有的操作要么都成功要么都失败
- 一致性:确保数据库从一个一致状态转变成另一个一致的状态
- 隔离性:多个事务并发执行不会互相影响
- 持久性:已被提交的事务对数据库的修改应该永远的保存在数据库中
java对事务的代码实现
java中操作数据库操作的关键类是
Connection
,它代表了对数据库的一个连接,通过对应的方法
-
connection.commit()
:执行事务的提交语义 -
con.rollback();
:执行事务的回滚语义 可以控制事务操作
spring中运用事务
spring中最简单的实现只需要直接在要使用事务的类上添加注解
@Transactional
,并在xml中添加注解的扫描
<tx:annotation-driven transaction-manager="txManagerTest"/>
基本就可以利用spring的事务了