2013-04-25 1 views
0

У меня есть класс утилиты, который я хочу инициализировать, когда приложение запускается в Spring MVC. Поэтому я реализую InitializingBean. Теперь мне нужно создать объект для него и сохранить его в области приложения, чтобы я мог получить доступ к одному и тому же экземпляру повсюду. Но я не могу это понять.Установить объект в контексте приложения весной mvc

Вот моя попытка:

public class DashboardInitializer implements InitializingBean, ApplicationContextAware { 

    private ApplicationContext mApplication; 

    @Override 
    public void afterPropertiesSet() throws Exception { 

     initializeConfigurationUtil(); 

     ConfigurationUtil util = ConfigurationUtil.getInstance(); 

     /* Save the util to application scope */ 

    } 

    @Override 
    public void setApplicationContext(ApplicationContext pApplication) throws BeansException { 
     this.mApplication = pApplication; 
    } 
} 

Является ли такой подход правильным или есть лучший способ сделать это?

ответ

3

Я думаю, вам нужно немного упростить это.

Вы хотите, чтобы класс утилиты был инициализирован после загрузки контекста приложения, но вы также хотите, чтобы ваш класс util находился в контексте приложения?

Кажется, что класс util имеет некоторые объекты зависимостей, сконфигурированные в контексте приложения, а класс util в свою очередь зависит от некоторых классов в контексте приложения.

Если вы можете выразить эти зависимости в виде фасоли (утилита - это компонент, в который вставляются его бобы-зависимые компоненты, а бобы, которые нуждаются в утилите, будут использованы в них), Spring обеспечит, чтобы все зависимости от использования сначала инициализируются, затем утилита инициализируется, а затем вводится в классы, которые необходимо использовать.

Вы не должны пытаться добавить что-то в инициализированный контекст .. Его невозможно.

Если вы не можете выразить использование и его зависимости в виде бобов, вы также можете воспользоваться этим подходом: 1. Настройте использование в качестве компонента в контексте приложения, добавьте конструктор по умолчанию, который ничего не делает. Таким образом, этот объект будет создан, но не инициализирован при загрузке весеннего контекста.

  1. В ApplicationContextAware реализации у вас есть, изменить метод setApplicationContext. Получите утилиту bean, настроенную ранее из контекста.

  2. Теперь вы можете инициализировать (выполнить какой-то код, который вы хотите выполнить) экземпляр util, просто убедитесь, что вы не пытаетесь переназначить bean-компонент другому экземпляру утилиты.

Надеюсь, это поможет.

1

Вы можете использовать аннотацию @postconstruct о методах выполнения бизнес-логики сразу после того, как приложение было начато. И свойства могут быть просто введены с использованием заполнителя в config и @Value аннотация по java-полям.

+0

Я проверил '' '' @ PostConstruct''''. Это вызывается для каждого контроллера после создания объекта контроллера. Однако моя логика не специфична ни для какого контроллера, а для конкретного приложения. Мой ConfigurationUtil используется через контроллеры, поэтому я должен инициализировать его сразу после настройки приложения. Поэтому '' '' afterPropertiesSet() '' '' кажется идеальным выбором. Но я не могу получить, как сохранить свой экземпляр в контексте приложения, чтобы я использовал один и тот же экземпляр везде. Я думал об использовании '' '' ServletContextAware''''. Это правильный выбор для моей цели? – divinedragon

+0

postconstuct не является спецификацией для контроллера – NimChimpsky