Spring JDBC事务管理器

gen*_*cay 4 java spring web-services jdbc transactionmanager

我尝试在Spring中使用JDBC编写事务管理器.

我的app-servlet.xml

<!-- JDBC Config -->
<bean   id="dataSource" 
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" 
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" 
        p:username="${jdbc.username}" 
        p:password="${jdbc.password}" />

<!-- dataSource TransactionManager -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="UserDAOImpl" class="com.project.dao.impl.UserDAOImpl">
    <property name="transactionManager" ref="transactionManager"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

我的UserDAOImpl.java

public class UserDAOImpl implements UserDAO {

//transaction manager
private DataSourceTransactionManager transactionManager;
private JdbcTemplate jdbcTemplate;

public UserDAOImpl() {
    super();
    DataSource dataSource = transactionManager.getDataSource();
    jdbcTemplate = new JdbcTemplate(dataSource);
}

public void setTransactionManager(DataSourceTransactionManager transactionManager)    {
    this.transactionManager = transactionManager;
}
....
}
Run Code Online (Sandbox Code Playgroud)

即使我已经transactionManager在我的应用程序,servlet的豆,UserDAOImpl不会因为instatiated transactionManagernull.可能我会错过一些观点,但无法找出问题所在.

jef*_*eff 7

您应该为事务管理器使用构造函数注入.Spring将在注入transactionManager属性之前调用构造函数.

 public UserDAOImpl() 
 {
    /* Transaction Manager NOT set yet */
    DataSource dataSource = transactionManager.getDataSource();
 }
Run Code Online (Sandbox Code Playgroud)

将其更改为使用构造函数注入

 public UserDAOImpl(TransactionManager transactionManager) ...
Run Code Online (Sandbox Code Playgroud)

然后配置

 <bean id="UserDAOImpl" class="com.project.dao.impl.UserDAOImpl">
   <constructor-arg ref="transactionManager"/>
 </bean>
Run Code Online (Sandbox Code Playgroud)