从基于配置的服务bean切换到基于注释的服务bean时,TransactionProxyFactoryBean

时间:2009-10-27 17:01:40

标签: java hibernate spring proxy transactions

我读到了关于使用

的内容
  <context:component-scan base-package="tld.mydomain.business">
      <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  </context:component-scan>

并使用@Service(“myService”)注释我的服务bean,并且认为很好,我会这样做,因为我已经在使用我的控制器。我通常的服务bean配置看起来像

  <bean id="userService" parent="txProxyTemplate">
    <property name="target">
      <bean class="tld.mydomain.business.UserServiceImpl"/>
    </property>
    <property name="proxyInterfaces" value="tld.mydomain.business.UserService"/>
  </bean>

所以我现在生成它们,如何将它们包装在诸如TransactionProxyFactoryBean之类的Hibernate代理中?或者还有更好的方法吗?

我还没有走完所有并使用@Repository,是否需要?

干杯

的Nik

3 个答案:

答案 0 :(得分:4)

在现代Spring应用程序中不鼓励使用 TransactionProxyFactoryBean ,尽管它仍然有效。现在的典型方法是使用 @Transactional 注释类,然后将此元素粘贴到应用程序上下文文件中:

<tx:annotation-driven transaction-manager="txManager"/>

这个和其他策略在参考文档中有很深入的discussed,甚至还有关于 TransactionProxyFactoryBean 的附注。

答案 1 :(得分:1)

没有必要

<context:include-filter type="annotation"expression="org.springframework.stereotype.Service"/>

一旦在基础包中找到它们,Spring就会注册@Service, @Repository, @Component...

与@Rob一样,要么使用@Transactional<aop:config>...</aop:config>来处理服务级别的交易。

答案 2 :(得分:1)

如果您有两个不同的资源需要在同一个事务中,那么您将需要使用JTA。请参阅我之前的问题here的答案。您的配置需要看起来像:

<tx:annotation-driven transaction-manager="txManager"/>

<bean id="txManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManagerName" value="appserver/jndi/path" />
</bean>

其中appserver/jndi/path需要替换为应用程序服务器附带的JTA事务管理器的JNDI路径(尽管您也可以使用独立的JTA事务管理器,如JOTM)。 2.5.x API中提到的典型路径是:

  • Resin 2.x的“java:comp / UserTransaction”,Oracle OC4J(Orion),JOnAS(JOTM),BEA WebLogic
  • Resin 3.x的“java:comp / TransactionManager”
  • “GlassFish的java:appserver / TransactionManager”
  • Borland Enterprise Server和Sun Application Server(Sun ONE 7及更高版本)的“java:pm / TransactionManager”
  • JBoss Application Server的“java:/ TransactionManager”