Весна JDBC DAO - PullRequest
       9

Весна JDBC DAO

2 голосов
/ 02 сентября 2010

Я изучаю Spring (2 и 3), и я получил этот метод в ClientDao

    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), который, на мой взгляд, является простым: есть ли способ, которым я могу связать bean-компонент в файле .xml, чтобы сказать Spring, чтобы создать экземпляр реализации набора для набора «account» в ClientImpl? чтобы я мог избавиться от (2)

Теперь перейдем к (1): что произойдет, если реализация изменится? мне действительно нужно написать еще один DAO для другой реализации? или мне нужно построить BeanFactory? или есть другое, более красивое решение?

Спасибо!

1 Ответ

3 голосов
/ 02 сентября 2010

Я немного запутался здесь - почему вы определили bean-компонент ClientImpl в своем XML, но не используете его в Java?

У вас уже есть большая часть решения, вам просто нужноизвлекайте новый ClientImpl из Spring каждые итерации по циклу:

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 выполняется Spring, а не вашим кодом.

...