spring中aop:pointcut的expression的理解

spring的声名式事务,想必大家都很熟悉,之前我也自认为很熟悉。两天前帮同事调试了一段关于事务的代码,而事务采用的正是spring的声名式事务控制方式来管理。但是事务却不起作用,顿时蒙圈了,查了一下spring配置,其中aop:pointcut 中expression的值与execution(* a.b.**.service.support.*.*(..))类似,最后将表达式改为

execution(* a.b..service.support.*.*(..)),事务起作用了。从这个可以知道之前的配置不对。

为了更好的搞清楚experession表达式,所以特意组织的测试代码,测试了一下:

package a.b.c.d.e.service;
public interface HelloService {
    public void updateId(String bizTag) throws Exception;
}


package a.b.c.d.e.service.support;
import org.springframework.stereotype.Service;
import a.b.c.d.e.service.HelloService;
@Service
public class HelloServiceImpl implements HelloService {

//代码略

}

事务配置切面

<aop:config>
<aop:pointcut id="allServiceMethods"
expression="execution(* a.b.c.d.**.service.support.*.*(..))" />
<aop:advisor advice-ref="defaultTransactionAdvice"
pointcut-ref="allServiceMethods" />
</aop:config>
<tx:advice id="defaultTransactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="update*"  propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>

下面对应expression不同的值,打印的相应的log,只截取了开启事务的那一部分:

1.execution(* a.b.c.d.e.service.support.*.*(..))
2017-06-16 23:15:35,945 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:15:35,946 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:15:36,453 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@1614c61] for JDBC transaction
2017-06-16 23:15:36,461 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@1614c61] to manual commit

2.execution(* a.b.c.d..service.support.*.*(..))
2017-06-16 23:18:55,452 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:18:55,452 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:18:55,867 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@1614c61] for JDBC transaction
2017-06-16 23:18:55,874 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@1614c61] to manual commit

3.execution(* a.b.c..service.support.*.*(..))
2017-06-16 23:19:56,600 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:19:56,600 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:19:57,069 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@1614c61] for JDBC transaction
2017-06-16 23:19:57,077 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@1614c61] to manual commit

4.execution(* a.b..service.support.*.*(..))
2017-06-16 23:21:55,226 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:21:55,227 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:21:55,667 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@195ac46] for JDBC transaction
2017-06-16 23:21:55,674 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@195ac46] to manual commit

5.execution(* a..service.support.*.*(..))
2017-06-16 23:23:00,468 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:23:00,468 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:23:00,899 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@1614c61] for JDBC transaction
2017-06-16 23:23:00,906 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@1614c61] to manual commit

6.execution(* a.**.service.support.*.*(..))没有开启事务
7.execution(* a.b.**.service.support.*.*(..)) 没有开启事务
8.execution(* a.b.c.**.service.support.*.*(..)) 没有开启事务

9.execution(* a.b.c.d.**.service.support.*.*(..))

我也以为spring不会开启事务,但是代码就是这样的有趣,日志如下:
2017-06-16 23:27:30,101 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [a.b.c.d.e.service.support.HelloServiceImpl.updateId]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
2017-06-16 23:27:30,101 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/test]
2017-06-16 23:27:30,573 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mysql.jdbc.JDBC4Connection@e61d6c] for JDBC transaction
2017-06-16 23:27:30,581 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [com.mysql.jdbc.JDBC4Connection@e61d6c] to manual commit


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值