- 02-02-2009
Spring Framework :: Полезные советы :: @PostConstruct
Spring Framework :: Полезные советы :: @PostConstruct
Зачастую разработчику требуется наличие в контексте приложения (Application Context) бина проинициализированного некоторыми данными. Например, Вы хотите, чтобы у Вас в контексте приложения был под рукой бин, содержащий свойства приложения загруженные из базы данных.
Последовательность вызовов (flow) заложенных в Spring Framework не требуют наличия у Ваших бинов какого-нибудь метода inti() , переопределив который Вы могли бы инициализировать свой бин, так как Вы делаете это, например, с сервлетами. Поэтому, у начинающего разработчика возникает искушение выполнить инициализацию в конструкторе своего бина. Например, так как показано в следующем примере:
public class PropertiesBean {
private Map<String, String> propertiesMap = new HashMap<String, String>();
private PropertiesDAO propertiesDao;
public PropertiesBean() {
// Инициализация бина данными из БД
}
}Этот вариант будет работать до тех пор, пока Ваш конструктор будет абсолютно независим от контекста приложения, т.е. не будет пользоваться другими бинами, объявленными в контексте Вашего приложения. Но стоит Вам сослаться на один из бинов, например, обратиться к БД через DAO, как показано ниже, как Вы сразу же столкнетесь проблемой:
public class PropertiesBean {
private Map<String, String> propertiesMap = new HashMap<String, String>();
private PropertiesDAO propertiesDao;
public PropertiesBean() {
// Инициализация бина данными из DAO
propertiesMap = propertiesDao.getAllProperties();
}
}Проблема заключается в том, что propertiesDao к этому моменту еще не проинициализирован, т.к. Spring займется инжекцией этого бина только после того как бин PropertiesBean будет создан, т.е. уже после выполнения его конструктора. Т.о. java.lang.NullPointerException Вам гарантирован. Вот тут нам на выручку и приходит магическая аннотация @PostConstruct указывающая Spring-у на то, что «этот» метод должен будет быть выполнен после инициализации бина. Т.о. Следующий код гарантирует Вам успех:
public class PropertiesBean {
private Map<String, String> propertiesMap = new HashMap<String, String>();
private PropertiesDAO propertiesDao;
@PostConstruct
public init() {
// Инициализация бина данными из DAO
propertiesMap = propertiesDao.getAllProperties();
}
@Required
@Autowired
public void setPropertiesDao(LAPropertiesDAO propertiesDao) {
this.propertiesDao = propertiesDao;
}
}Spring Framework - первые шаги (Конспект десятый) :: Примеры приложений на Spring Framework :: Hello Twitter (Часть 1)
Vyacehslav Yakovenko специально для LifeIn
| Комментарии к статье "Spring Framework :: Полезные советы :: @PostConstruct " (7) |
| 02-03-2010 15-59 А как можно заменить <aop:scoped-proxy/> в XML файле на аннотацию в классе? Прошу прощения за глупый вопрос. Новичок я. |
|
|
| 08-04-2009 14-44 Спасибо, идеальное вступление для новичка |
| 01-04-2009 22-23 thx, пишите еще! |
| 25-03-2009 10-32 2 Другой гость: Пожалуйста, заходите еще ;) |
| 24-03-2009 22-58 Спасибо за очень обстоятельно описанный аспект Spring |
| 02-02-2009 18-24 Пурга |