<bean>
私の Spring アプリケーションには、XML 構成で単純な s として作成された大量の Bean (この場合は DAO) があります。これらのメソッドには、特に を含むさまざまな注釈があり@Transactional
ます。私も当然そう<tx:annotation-driven />
です。
しかし、これらのオブジェクトの一部 (一部のみではありますが) では、プロキシが作成されず (デバッグ ログを有効にすることでこれを確認しました)、@Transactional
注釈は効果がありません。代わりに、これらの DAO への (通常は自動配線された) 参照を含むオブジェクトは、プロキシではなく、直接のクラスへの参照に配線されます。
すべてのクラスには対応するインターフェースがあり、自動配線された参照は常にこれらのインターフェースを介して行われます。
どのクラスがプロキシを取得し、どのクラスが取得しないのかわかりません。私はそれらすべてをしたい。だから私の質問は:
a) いくつかのインターフェースを実装しているにもかかわらず、Spring がクラスのプロキシを作成しないのはどのような状況ですか?
b) Spring に必要なプロキシを強制的に作成させるにはどうすればよいですか?
プロキシを明示的に有効にするために何もしていないことに注意してください。ただし、過去にはその必要はありませんでした。通常は機能します。
Spring 3.1.3 と 3.2.2 の両方で試しました。
私はこれのための SSCCE を持っていません。基本的に私のXMLは
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:sec="http://www.springframework.org/schema/security"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring
http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.2.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
">
<bean id="userDao" class="com.soschat.dao.spring.SpringUserDAO"/>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class=" org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
<property name="globalRollbackOnParticipationFailure" value="false" />
</bean>
... etc ...
</beans>
私のコードは多かれ少なかれ
public class UserDaoImpl implements UserDao {
@Override
@Transactional
@Cacheable
public User getUserById(long userId) {
// do stuff
}
}
過度の詳細がなければ、どれだけ追加する必要があるかわかりません。
興味深い追加の 1 つ - BeanNameAutoProxyCreator を使用して強制的にプロキシを作成することができます。しかし、そこに追加した注釈は実際には有効になりません。