весенняя инициализация веб-приложения из базы данных при запуске - PullRequest
3 голосов
/ 16 августа 2011

Весна 3.1 + Tomcat

У меня есть вопрос дизайна:

Существует группа категорий, которые были указаны в базе данных. Эти категории можно считать глобальными в том смысле, что их можно использовать в веб-приложении. То, что я хотел бы сделать, это прочитать эти категории при запуске сервера и заполнить некоторый тип коллекции в Java. Единственное, что нужно прочитать из базы данных один раз при запуске, считать это типом инициализации.

Два варианта, которые я могу придумать:

1) Должен ли я использовать не лениво инициализированный бин?

или

2) Изменение файла web.xml?

Я не совсем уверен, что является предпочтительным методом, и любые инструкции о том, как выполнить ваш рекомендуемый, будут высоко оценены. Спасибо!

Ответы [ 2 ]

4 голосов
/ 16 августа 2011

Опции, которые вы указали, используются чаще всего:

  1. Используйте одноэлементный ленивый компонент с методом, аннотированным @PostConstruct (но учтите, что @Transactional может не работать ). Вы можете иметь несколько bean-компонентов с такой процедурой инициализации.

  2. Расширьте org.springframework.web.context.ContextLoaderListener и используйте его в web.xml. Я считаю, что это решение менее изящно, а также продвигает плохой стиль программирования (расширение с помощью вызова super для улучшения базового класса)

3 голосов
/ 16 августа 2011

Я использовал Controller, который реализует как ServletContextAware, так и InitializingBean.Контроллер запускается при запуске приложения, и я запускаю код загрузки параметров в методе afterPropertiesSet, чтобы ServletContext был правильно введен.Затем свойства доступны по всему приложению из ServletContext.Код:

@Controller
public class ParameterizationController implements ServletContextAware , InitializingBean  {

protected final Log logger = LogFactory.getLog(getClass());
public static final String PARAMETERS_SC_ATTRIBUTE = "allProps";

private ServletContext sc;

public ParameterizationController() {
    logger.info("inside ParameterizationController...");
}

@Autowired
private SomeService someService;

@RequestMapping("/loadparams.do")
public String formHandler(
        Model model) {
    String forwardValue = "/loadparams";
    // an admin can also call this page to reload props at runtime
    this.sc.setAttribute(PARAMETERS_SC_ATTRIBUTE, loadProperties());
    return forwardValue;
}

private HashMap<Integer, HashMap<String, String>> loadProperties() {
    return someService.loadProperties();
}

// makes sure the SC is injected for use
public void setServletContext(ServletContext sc) {
    this.sc = sc;
}

// only runs after all injections have been completed
public void afterPropertiesSet() throws Exception {
    this.sc.setAttribute(PARAMETERS_SC_ATTRIBUTE, loadProperties());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...