5

我尝试在 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>

我的 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;
}
....
}

即使transactionManager我的 app-servlet 中有 Bean,UserDAOImpl也不会被实例化,因为transactionManageris null. 可能我错过了一些点,但无法找出问题所在。

4

4 回答 4

8

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

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

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

 public UserDAOImpl(TransactionManager transactionManager) ...

然后配置

 <bean id="UserDAOImpl" class="com.project.dao.impl.UserDAOImpl">
   <constructor-arg ref="transactionManager"/>
 </bean>
于 2012-08-03T02:22:09.820 回答
3

如果您使用带有注释的spring,这应该可以

@Repository
public class UserDAOImpl implements UserDAO{

@Autowired
private DataSourceTransactionManager transactionManager;

private JdbcTemplate jdbcTemplate;

@Autowired
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

你可以在配置中取消这一行

<bean id="UserDAOImpl" class="com.project.dao.impl.UserDAOImpl">
<property name="transactionManager" ref="transactionManager"/>
</bean>

而是进行组件扫描:

<!-- Scans within the base package of the application for @Components to configure as beans -->
<context:component-scan base-package="${your package}" />

您可以在文档中对此进行更多参考。如果您不使用注释,请将给定链接的 URL 中的发布版本更改为您正在使用的版本。那有足够多的例子可以在没有注释的情况下做同样的事情。

于 2012-08-03T02:17:13.453 回答
0

您是否有属性文件或其他方式来初始化这些变量

p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" 
        p:username="${jdbc.username}" 
        p:password="${jdbc.password}"

这些是占位符,需要值,例如在此链接中

有一个名为 jdbc.properties 的属性文件,它定义了驱动程序类名称等的数据。

这是示例的示例源代码

于 2012-08-03T01:51:26.087 回答
0

您还可以修改获取 jdbcTemplate:

public void setTransactionManager(DataSourceTransactionManager transactionManager)    {
  this.transactionManager = transactionManager;
  DataSource dataSource = transactionManager.getDataSource();
  jdbcTemplate = new JdbcTemplate(dataSource);
} 
于 2012-08-03T07:08:16.870 回答