我尝试在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;
}
....
}
即使我的app-servlet中有transactionManager
Bean,UserDAOImpl
也不会被设置,因为transactionManager
是null
。可能我会错过一些观点,但无法找出问题所在。
答案 0 :(得分:7)
您应该为事务管理器使用构造函数注入。 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>
答案 1 :(得分: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}" />
您可以在documentation中详细说明。如果您未使用注释,请将给定链接的URL中的发行版更改为您正在使用的链接。这有足够的例子来做同样没有注释。
答案 2 :(得分:0)
您是否有属性文件或其他方式来初始化这些变量
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"
这些是占位符,需要使用值,例如link
有一个名为jdbc.properties的属性文件,用于定义驱动程序类名称等的数据。
以下是example
的示例源代码答案 3 :(得分:0)
您还可以修改获取jdbcTemplate:
public void setTransactionManager(DataSourceTransactionManager transactionManager) {
this.transactionManager = transactionManager;
DataSource dataSource = transactionManager.getDataSource();
jdbcTemplate = new JdbcTemplate(dataSource);
}