TransactionProxyFactoryBean при переключении с бинов Service на основе конфигурации на бины Service на основе аннотаций - PullRequest
2 голосов
/ 27 октября 2009

Я читал об использовании

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

и аннотирую мои служебные бины с помощью @Service ("myService"), и подумал, что я сделаю это, поскольку я уже делаю это с моими контроллерами Моя обычная конфигурация служебного компонента выглядит как

  <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, это обязательно?

Приветствия

Nik

Ответы [ 3 ]

4 голосов
/ 27 октября 2009

Использование TransactionProxyFactoryBean не рекомендуется в современных приложениях Spring, хотя все еще работает. В настоящее время типичный подход состоит в том, чтобы аннотировать классы с помощью @ Transactional , а затем вставлять этот элемент в файл контекста приложения:

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

Эта и другие стратегии подробно обсуждаются в справочном документе, и есть даже примечание о TransactionProxyFactoryBean .

1 голос
/ 28 октября 2009

Если у вас есть два разных ресурса, которые должны быть в одной и той же транзакции, вам нужно будет использовать JTA. Смотрите мой ответ на предыдущий вопрос здесь . Ваша конфигурация должна выглядеть примерно так:

<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 необходимо заменить на путь JNDI менеджера транзакций JTA, который поставляется с вашим сервером приложений (хотя вы также можете использовать автономный менеджер транзакций JTA, такой как JOTM). Типичные пути, указанные в 2.5.x API :

  • «java: comp / UserTransaction» для Resin 2.x, Oracle OC4J (Orion), JOnAS (JOTM), BEA WebLogic
  • «java: comp / TransactionManager» для смолы 3.x
  • «java: appserver / TransactionManager» для GlassFish
  • «java: pm / TransactionManager» для Borland Enterprise Server и сервера приложений Sun (Sun ONE 7 и более поздних версий)
  • «java: / TransactionManager» для сервера приложений JBoss
1 голос
/ 27 октября 2009

Нет необходимости в

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

Spring зарегистрирует @Service, @Repository, @Component..., как только они будут найдены в базовом пакете.

Как сказал @Rob, используйте @Transactional или <aop:config>...</aop:config> для обработки транзакций на уровне обслуживания.

...