2011-12-20 3 views
1

Я пытаюсь запустить и остановить планировщик кварца в одноэлементном бобах весны. Но postconstruct вызывается два раза, а preestroy вообще не вызывается. This ссылается на то, что из-за проксирования его естественно вызывать дважды, но это вызывает исключение в методе postconstruct. Я хочу, чтобы postConstruct вызывался один раз после загрузки одного синтаксиса.Отметки Spring @PreDestroy и @PostConstruct

ответ

0

Я пишу слушатель контекстного загрузчика и меняю прослушиватель web.xml. Так что я могу инициализировать bean-компонент только один раз.

<listener> 
     <listener-class> 
       CustomContextLoaderListener 
     </listener-class> 
    </listener> 

public class CustomContextLoaderListener extends 
         org.springframework.web.context.ContextLoaderListener{ 
    Scheduler scheduler; 

    @Override 
    public void contextInitialized(javax.servlet.ServletContextEvent event) { 
      try{ 
      super.contextInitialized(event); 
      this.scheduler= WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()).getBean(Scheduler.class); 

    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event){ 

      super.contextDestroyed(event); 
      scheduler.stopSchedulers(); 


    } 
0

Почему бы вам не попробовать это с помощью init-method или попробовать реализовать инициализирующий компонент. Они обеспечивают альтернативные подходы к postConstruct.

Когда пружинные бобы выгружаются, то есть когда контейнер закрыт или метод close() в методе ConfigurableApplicationContext вызывается каким-либо другим способом, вызывается preDestroy.

+0

init-metod также называется два раза – ayengin

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