我读到了关于使用
的内容 <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
答案 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中提到的典型路径是: