2015-01-24 15 views
0

У меня есть приложение SpringBoot и вы хотите получить доступ к предоставленному JdbcTemplate в конструкторе. Я пытаюсь кэшировать некоторые данные из базы данных при создании экземпляра класса. Мой Groovy код выглядит следующим образом:доступ JdbcTemplate в конструкторе приложения SpringBoot

@Repository 
class EarthquakeRepository { 

@Autowired 
private final JdbcTemplate jdbcTemplate 

public EarthquakeRespository() { 
    //fails because jdbcTemplate is null 
    assert jdbcTemplate 
} 
... 

Даже при том, что конструктор уволят, то JdbcTemplate равно нулю. Другие методы в репозитории имеют доступ к jdbcTemplate.

Может кто-нибудь указать, что мне здесь не хватает?

Спасибо!

--john

ответ

2

При использовании инъекции поля, как у вас здесь, экземпляр класса создается, и, следовательно, конструктор вызывается прежде, чем произойдет инъекции. Вот почему jdbcTemplate имеет значение NULL, когда вы пытаетесь использовать его в конструкторе. Это должно происходить таким образом, поскольку, не вызывая сначала конструктор, нет ничего, что могло бы быть введено в зависимость.

Вы можете изменить свою репостарию для использования инъекции конструктора: объявить JdbcTemplate в качестве параметра конструктора и аннотировать конструктор с помощью @Autowired. Вы можете использовать JdbcTemplate в конструкторе, если хотите.

Вы также можете добавить метод, аннотированный @PostConstruct к вашему классу репозитория. Этот метод будет вызван после того, как экземпляр будет создан (так как произошла инсталляция конструктора), а также после того, как вставка поля была выполнена, если вы продолжите этот подход. Затем вы используете JdbcTemplate в этом методе для выполнения кэширования.

Моей рекомендацией было бы перейти к использованию инъекции конструктора, так как это упростит тестирование ваших классов (легко передать макет в конструктор) и переместить использование JdbcTemplate в 0-месячный метод @PostConstruct, тем самым конструктор как можно более легкий.

 Смежные вопросы

  • Нет связанных вопросов^_^