在我的 Spring 应用程序中,我有一大堆 bean(在本例中是 DAO),它们<bean>
在我的 XML 配置中创建为 simple s。在这些方法中有各种注释,包括具体@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
}
}
不知道在没有过多细节的情况下我还需要添加多少。
一个有趣的补充——我可以强制它使用 BeanNameAutoProxyCreator 创建代理。但是我放在那里的注释都没有真正生效。