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

transactionManagerapp-servletにBeanが含まれていても、であるUserDAOImplため、インスタンス化されません。おそらく私はいくつかの点を見逃していますが、何が悪いのかを見つけることができませんでした。transactionManagernull

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

注釈付きの春を使用している場合、これは機能するはずです

@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 に答える