如果在阅读的时候有不足的地方,欢迎各位指出!
本部分包含事务管理,AOP
事务管理
事务: 一组操作的集合,这组操作要么全部成功,要么全部失败。
操作:
开启事务:start transcation
/ begin
提交事务:commit
回滚事务:rollback
Spring事务管理
在Spring中开启事务管理只需要添加注解@Transactional
开启事务管理日志:
logging:
level:
org.springframework.jdbc.support.jdbcTransactionManager:debug
事务回滚
rollbackFor
:
默认情况下只添加@Transactional
注解,只有出现RunTimeException
才会回滚。rollbackFor
属性可以控制出现哪种异常回滚事务。
事务传播
propagtion:
掌握两个:
-
REQUIRED: 知道默认情况下事务是怎么处理的。
-
REQUIRES_NEW: 当我们希望事务之间互不影响的时候可以使用该传播行为,例如,下订单前需要记录日志,无论失败和成功都要insert。
AOP
基础
AOP
: 面向切面编程。要对业务功能中的增删改查添加统一的功能,使用AOP最为方便。
快速入门:
使用场景以及优缺点:
使用场景:
事务管理底层是使用AOP进行实现的,在方法开始的时候开启事务,在方法结束的时候提交事务。
权限控制,日志记录。
优点:
无代码入侵,你可以在不修改原先代码的逻辑上,为该代码增加功能。减少重复代码,易于维护等。
核心概念:
执行流程:
SpringAOP
在底层使用动态代理,将目标对象的方法进行增强=》 复制原对象的代码,并根据AOP中的代码进行增加。
通知类型
切入点表达式的小优化:
//原先形式:
@Before("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
public void before()
{
log.info("before....")
}
//将切入点整合(声明一个函数)
@PointCut("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
public void pt(){}
@Before("pt()")
public void before()
{
log.info("before....")
}
通知顺序
不同的切面类的执行顺序默认以类名先后执行。当然也可以添加@Order
注解来设置(Filter(过滤器)也可以通过@Order
组件进行设置)。
切点表达式
如果你要写两个毫不相关的方法的切点表达式,你可以试试这样:
@Pointcut("execution(* com.itheima.service.DepServceImpl.delete().(..)) || execution(* com.itheima.service.DeptServiceImpl.list()) ")
private void pt(){}
切入点表达式的通配符:
@annoation
:
//@annoation注解,用于匹配标识有注定注解的方法
@Before("@annoation(com.itheima.anno.Log)")
public void before()
{
log.info("before...);
}
连接点
值得一提的是:如果你通过 Object result = joinPoint.proceed();
来获得方法的返回值,那么你该切面就要返回return result
。否则在目标方法中无返回值。
通过连接点可以来获得目标的属性等值