TransactionProxyFactoryBean来从基于配置的服务豆切换到基于注解服务豆

TransactionProxyFactoryBean来从基于配置的服务豆切换到基于注解服务豆

问题描述:

,当我读到有关使用TransactionProxyFactoryBean来从基于配置的服务豆切换到基于注解服务豆

<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 id="userService" parent="txProxyTemplate"> 
    <property name="target"> 
     <bean class="tld.mydomain.business.UserServiceImpl"/> 
    </property> 
    <property name="proxyInterfaces" value="tld.mydomain.business.UserService"/> 
    </bean> 

所以现在,我产生他们,我该如何将它们包装在一个Hibernate代理诸如TransactionProxyFactoryBean来?还是有更好的方法来做到这一点?

我还没有走完一路,并使用@Repository以及是否需要?

干杯

使用TransactionProxyFactoryBean来没有现代Spring应用程序鼓励,但它仍然有效。典型的做法现在是注释类与@Transactional,然后在你的应用程序上下文文件坚持这个元素:

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

这和其他策略discussed在参考文献中非常深入,甚至还有一个注意事项关于TransactionProxyFactoryBean

+0

非常感谢,我在Spring 2上推荐了一本关于TransactionProxyFactoryBean的书,我现在看到我应该更仔细地检查过这些文档。不过,只需要简单的跟进:这似乎只适用于只有一个事务管理器的情况。不幸的是,我有两个,因为我需要与两个不同的数据库一起工作。这是使用TransactionProxyFactoryBean没有问题。表9.2和9.3似乎并不建议我可以 – niklassaers 2009-10-27 19:41:34

+0

嗯,当我这样做时,我在访问我的服务时遇到以下异常:org.springframework.beans.factory.BeanNotOfRequiredTypeException:Bean名为'org.springframework.transaction.interceptor .TransactionInterceptor#0'必须是[org.aopalliance.aop.Advice]类型,但实际上是[org.springframework.transaction.interceptor.TransactionInterceptor]类型 – niklassaers 2009-10-27 20:10:09

+0

它可能是@Service(“myService”)和@交易注释冲突? – niklassaers 2009-10-27 20:37:00

没有必要对

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

Spring将注册@Service, @Repository, @Component...一旦他们在基础包中找到。

Like @Rob表示要么使用@Transactional要么使用<aop:config>...</aop:config>来处理服务级别的事务。

+0

感谢您的提示,我已经删除了额外的混乱。你有什么建议,为什么我得到上面的BeanNotOfRequiredTypeException异常?或者如何处理多个事务管理器?我从文档中看到,我可以使用给出不同的建议,但在我看来,这仍然只存在于一个事务管理器中? – niklassaers 2009-10-27 20:28:38

+0

通常'BeanNotOfRequiredType'当你注入一个错误类型的bean时,除非你发布堆栈跟踪,否则我不能进一步说话。那么你只需要1个'PlatformTransactionManager',除非你有2个'DataSource',否则不需要2个。 – 2009-10-29 15:50:04

如果您有两个不同的资源需要在同一个事务中,那么您将需要使用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事务管理器,如JTA事务管理器的JNDI路径被替换JOTM)。如在2.5.x API提到典型路径是:

  • 的 “java:COMP/UserTransaction的” 为树脂2.x的,甲骨文OC4J(猎户)纳斯(JOTM),BEA的WebLogic
  • 的“java:COMP /事务管理“对于Resin 3。X
  • 的 “java:应用服务器/事务管理” 为GlassFish的
  • 的 “java:PM /事务管理” 为Borland Enterprise Server和太阳应用服务器(的Sun ONE 7或更高版本)
  • 的 “java:/事务管理” 为JBoss应用程序服务器
+0

嗨工具包,非常感谢您的意见。当我使用TransactionProxyFactoryBean时,我已经能够解决它,因为它并不是必须将它们保留在同一个事务中,我也可以有两个,其中一个是只读的。这就是为什么我问到说什么交易去哪里。将它们合并成一个似乎是最好的主意。但都是JDBC连接,我没有使用JNDI。但是我会在早上读你的建议(现在是午夜)Cheers-Nik – niklassaers 2009-10-27 23:21:17