2010-09-02 7 views
2

Im apprentissage printemps (2 et 3) et je suis arrivé cette méthode dans un ClientDaoSpring 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); 
} 

et le suivant le câblage du printemps:

<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> 

Les choses est que je ne aime pas la lignes commentées de code java (1) et (2). Je vais commencer par (2) que je pense est le facile: est-il un moyen que je peux câbler le bean dans le fichier .xml pour dire au printemps d'instancier une implémentation pour l'ensemble 'accounts' dans ClientImpl? donc je peux me débarrasser de (2)

Passons maintenant à (1): que se passe-t-il si l'implémentation change? ai-je vraiment besoin d'écrire un autre DAO pour une implémentation différente? ou dois-je construire une BeanFactory? ou y a-t-il une autre solution plus belle?

Merci!

Répondre

3

Je suis un peu confus ici - pourquoi avez-vous défini un bean ClientImpl dans votre XML, mais ne l'utilisez pas dans votre Java?

Votre possédez déjà la majeure partie de la solution, il vous suffit de chercher un nouveau ClientImpl du printemps chaque itération dans la boucle:

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

Avec cette approche, la construction proprement dite et l'initialisation de ClientImpl se fait au printemps , pas votre code.

+0

Merci. Je ne sais pas pourquoi je pensais qu'avoir une usine dans le DAO était mauvais. Maintenant ça semble aller. Je dois être fatigué. – Blitzkr1eg

Questions connexes