spring AOP和事务相关知识

一、事务的四大特性

1.1 原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败。

begin transaction;
    update account set money = money-100 where name = '张三';
    update account set money = money+100 where name = '李四';
commit transaction;

1.2 一致性(Consistency)

官网上事务一致性的概念是:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

换一种方式理解就是:事务按照预期生效,数据的状态是预期的状态。

举例说明:张三向李四转100元,转账前和转账后的数据是正确的状态,这就叫一致性,如果出现张三转出100元,李四账号没有增加100元这就出现了数据错误,就没有达到一致性。

1.3 隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

1.4 持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

二、springAOP

AOP的定义
AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。

面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,如下图所示:

AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。

AOP的作用
AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。

主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。

简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。

 AOP 切入点的操作

官方文档的解释是:

40.1.3 AspectJ 表达式切入点

从 2.0 开始,Spring 使用的最重要的切入点类型是org.springframework.aop.aspectj.AspectJExpressionPointcut。这是一个切入点,该切入点使用 AspectJ 提供的库来解析 AspectJ 切入点表达式字符串。

有关支持的 AspectJ 切入点 Primitives 的讨论,请参见上一章。

40.1.4 便捷切入点实现

Spring 提供了几种方便的切入点实现。有些可以直接使用。其他的则打算在特定于应用程序的切入点中子类化。

Static pointcuts

静态切入点基于方法和目标类,并且不能考虑方法的参数。静态切入点已足够-最好-对于大多数用法。首次调用方法时,Spring 可能只评估一次静态切入点:此后,无需在每次方法调用时再次评估切入点。

让我们考虑一下 Spring 附带的一些静态切入点实现。

正则表达式切入点

指定静态切入点的一种明显方法是正则表达式。除了 Spring 之外,还有几个 AOP 框架使之成为可能。 org.springframework.aop.support.Perl5RegexpMethodPointcut是通用的正则表达式切入点,使用 Perl 5 正则表达式语法。 Perl5RegexpMethodPointcut类依赖于 Jakarta ORO 进行正则表达式匹配。 Spring 还提供了JdkRegexpMethodPointcut类,该类使用 JDK 1.4 中的正则表达式支持。

使用Perl5RegexpMethodPointcut类,可以提供模式字符串的列表。如果其中任何一个匹配,则切入点将评估为 true。 (因此,结果实际上是这些切入点的并集.)

用法如下所示:

<bean id="settersAndAbsquatulatePointcut"
        class="org.springframework.aop.support.Perl5RegexpMethodPointcut">
    <property name="patterns">
        <list>
            <value>.set.</value>
            <value>.*absquatulate</value>
        </list>
    </property>
</bean>

Spring 提供了一个便利类RegexpMethodPointcutAdvisor,该类使我们也可以引用一个 Advice(请记住,Advice 可以是拦截器,在建议,引发建议等之前)。在后台,Spring 将使用JdkRegexpMethodPointcut。使用RegexpMethodPointcutAdvisor简化了接线,因为一个 bean 封装了切入点和建议,如下所示:

<bean id="settersAndAbsquatulateAdvisor"
        class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice">
        <ref bean="beanNameOfAopAllianceInterceptor"/>
    </property>
    <property name="patterns">
        <list>
            <value>.set.</value>
            <value>.*absquatulate</value>
        </list>
    </property>
</bean>
  • RegexpMethodPointcutAdvisor *可以与任何建议类型一起使用。
Attribute-driven pointcuts

静态切入点的一种重要类型是元数据驱动的切入点。这使用元数据属性的值:通常是源级别的元数据。

Dynamic pointcuts

动态切入点比静态切入点更昂贵。它们考虑了方法* arguments *以及静态信息。这意味着必须在每次方法调用时对它们进行评估。由于参数会有所不同,因此无法缓存结果。

主要示例是control flow切入点。

控制流切入点

Spring 控制流切入点在概念上类似于 AspectJ * cflow *切入点,但功能较弱。 (当前无法指定一个切入点在另一个切入点所匹配的连接点以下执行.)控制流切入点与当前调用堆栈匹配。例如,如果连接点是由com.mycompany.web包中的方法或SomeCaller类调用的,则可能会触发。控制流切入点使用org.springframework.aop.support.ControlFlowPointcut类指定。

Note

与其他动态切入点相比,控制流切入点在运行时进行评估要昂贵得多。在 Java 1.4 中,成本约为其他动态切入点的 5 倍。

更多请看Spring Framework 中文文档 - 40. 经典 Spring AOP 用法 | Docs4dev

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值