spring AOP 的声明试 事务
先在spring配置文件写出 transaction的命名空间
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
<!--配置事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
这是替换 通知类的注入bean的配置
class 写的是事务管理器对象的全类名
<!--定义事务管理的通知类-->
<tx:advice id="advice" transaction-manager="txManager">
<!--定义控制的事务-->
<tx:attributes>
<tx:method name="transfer" read-only="false"/>
</tx:attributes>
</tx:advice>
transaction-manager 中的 “txManager” 是 配置事务管理器配置的id名
tx:method name=“transfer” 指定事务是对通知类中那个方法起作用,
read-only=“false” 设置事务对这个方法控制的是 只读操作 还是 读写操作, 设置只读操作 写true; 设置 读写操作 写false
transaction-manager=“txManager” 是必需有的
<!--配置AOP的切入点 与 通知-->
<aop:config >
<!--切入点-->
<aop:pointcut id="pt" expression="execution(* *..transter(..))"/>
<!--配置aop-->
<aop:advisor advice-ref="advice" pointcut-ref="pt"/>
</aop:config>
pointcut-ref="pt"是 aop:pointcut id=“pt” 的id名称
aop:advisor advice-ref=“advice” 是 tx:advice id=“advice” 的id名称
这就将aop的通知类全都写到配置文件里,就不用在java代码中写aop的通知类,之前对通知类的配置也被 配置事务管理器 和 定义事务管理的通知类 取代了
注意点:
<tx:method name=“transfer” read-only=“false”/>
将这段 写成
<tx:method name="" read-only=“false”/>
就表示对所有的事务进行 读写操作
这么写了后
expression="execution( com.itheima.service.Service.(…))"
切入点 要写成 接口的包 和 接口名
aop:advice与aop:advisor区别
-
aop:advice配置的通知类可以是普通java对象,不实现接口,也不使用继承关系
-
aop:advisor配置的通知类必须实现通知接口
-
MethodBeforeAdvice
-
AfterReturningAdvice
-
ThrowsAdvice
-
……
-
tx配置----tx:advice
-
名称:tx:advice
-
类型:标签
-
归属:beans标签
-
作用:专用于声明事务通知
-
格式:
<beans> <tx:advice id="txAdvice" transaction-manager="txManager"> </tx:advice> </beans>
-
基本属性:
-
id :用于配置aop时指定通知器的id
-
transaction-manager :指定事务管理器bean
-
tx:attributes
-
名称:tx:attributes
-
类型:标签
-
归属:tx:advice标签
-
作用:定义通知属性
-
格式:
<tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> </tx:attributes> </tx:advice>
-
基本属性:
- 无
tx配置----tx:method
-
名称:tx:method
-
类型:标签
-
归属:tx:attribute标签
-
作用:设置具体的事务属性
-
格式:
<tx:attributes> <tx:method name="*" read-only="false" /> <tx:method name="get*" read-only="true" /> </tx:attributes>
-
说明:
通常事务属性会配置多个,包含1个读写的全事务属性,1个只读的查询类事务属性