Java / Статьи / Главная страница
02-02-2009

Spring Framework :: Полезные советы :: @PostConstruct

Зачастую разработчику требуется наличие в контексте приложения (Application Context) бина проинициализированного некоторыми данными. Например, Вы хотите, чтобы у Вас в контексте приложения был под рукой бин, содержащий свойства приложения загруженные из базы данных.

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 файле на аннотацию в классе? Прошу прощения за глупый вопрос. Новичок я.

IMDagger

04-09-2009 20-17 "у Ваших бинов какого-нибудь метода inti()", поправьте, плз, на init

Yangus

08-04-2009 14-44 Спасибо, идеальное вступление для новичка

tech

01-04-2009 22-23 thx, пишите еще!

Vyacheslav Yakovenko

25-03-2009 10-32 2 Другой гость: Пожалуйста, заходите еще ;)

Другой гость

24-03-2009 22-58 Спасибо за очень обстоятельно описанный аспект Spring

Гость

02-02-2009 18-24 Пурга


Вам есть, что сказать?




  Введите код