1

我正在将我的 Spring 应用程序从旧式的基于 xml 的配置转移到基于注释的配置。目前我在 xml 中org.springframework.transaction.interceptor.TransactionProxyFactoryBean定义了所有服务,并为每个服务定义。

    <bean id="dataServiceTarget" class="com.company.DataService">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <bean id="dataService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="target" ref="dataServiceTarget"/>
        <property name="transactionAttributes">
            <props>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="delete*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="search*">PROPAGATION_REQUIRED,readOnly</prop>
            </props>
        </property>
    </bean>

我即将用注解来注解服务@Transactional

来自http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html

<tx:advice id="txAdvice" transaction-manager="txManager">
  <!-- the transactional semantics... -->
  <tx:attributes>
    <!-- all methods starting with 'get' are read-only -->
    <tx:method name="get*" read-only="true"/>
    <!-- other methods use the default transaction settings (see below) -->
    <tx:method name="*"/>
  </tx:attributes>
  </tx:advice>

  <!-- ensure that the above transactional advice runs for any execution
    of an operation defined by the FooService interface -->
  <aop:config>
    <aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
  </aop:config>

但是每次我有以以下方式开头的方法时,我都必须向注释添加readonly=true属性:@Transactionalget

  @Transactional(readOnly = true)
  public void getFoo() {
      return ...;  
  }

我有许多方法不是以它们开头的get,它们不应该是只读的。所以我不能@Transactional(readOnly = false)上课。

可能的解决方案是将类划分为只读和读写部分,但现在我们的代码真的很难。另一种解决方案是使用上面的示例。

Spring 是否能够get*一次将所有方法注释为只读方法?
任何帮助表示赞赏。

4

0 回答 0