2010-09-02 77 views
2

林學習彈簧(2和3)和i得到這個方法在ClientDao彈簧JDBC DAO

public Client getClient(int id) { 
    List<Client> clients= getSimpleJdbcTemplate().query(
      CLIENT_GET, 
      new RowMapper<Client>() { 
       public Client mapRow(ResultSet rs, int rowNum) throws SQLException { 
        Client client = new ClientImpl(); // !! this (1) 
        client.setAccounts(new HashSet<Account>()); // !! this (2) 
        client.setId(rs.getInt(1)); 
        client.setName(rs.getString(2)); 
        return client; 
       } 
      },id 
      ); 
    return clients.get(0); 
} 

和下面的彈簧佈線:

<bean id="account" class="client.AccountRON" scope="prototype"> 
    <property name="currency" value = "RON" /> 
    <property name="ammount" value="0" /> 

</bean>  
<bean id="client" class="client.ClientImpl" scope="prototype"> 
    <property name="name" value="--client--" /> 
    <property name="accounts"> 
     <set> 
     </set> 
    </property> 
</bean> 

的事情是,我不喜歡的java代碼(1)和(2)的註釋行。我會從(2)開始,我認爲這很簡單:有沒有一種方法可以在.xml文件中連接bean,告訴spring實例化ClientImpl中設置的「帳戶」的集合實現?所以我可以擺脫(2)

現在轉到(1):如果實施更改會發生什麼?我真的需要爲另一個實現編寫另一個DAO嗎?或者我必須構建一個BeanFactory?還是有另一個更美麗的解決方案?

謝謝!

回答

3

我在這裏有點困惑 - 爲什麼你在你的XML中定義了一個ClientImpl bean,但是沒有在你的Java中使用它?

你已經有大部分的解決方案,你只需要在每次迭代通過循環來從春季新ClientImpl

private @Autowired BeanFactory beanFactory; 

public Client getClient(int id) { 
    List<Client> clients= getSimpleJdbcTemplate().query(
      CLIENT_GET, 
      new RowMapper<Client>() { 
       public Client mapRow(ResultSet rs, int rowNum) throws SQLException { 
        Client client = beanFactory.getBean(Client.class); 
        client.setId(rs.getInt(1)); 
        client.setName(rs.getString(2)); 
        return client; 
       } 
      },id 
    ); 
    return clients.get(0); 
} 

通過這種方法,實際建設和ClientImpl初始化是由春季完成,而不是你的代碼。

+0

謝謝。我不知道爲什麼我認爲在DAO中有一個工廠是不好的。現在看起來沒問題。我一定很累。 – Blitzkr1eg 2010-09-02 19:26:38