2017-08-15 13 views
2

私は春のアプリケーションを持っています。私はクラスをautowiringしていて、うまく動作しています。例えばのために 春はサーバーの起動時にクラスをオートワイヤーします

@Controller 
public class SearchController { 
    @Autowired 
    private EnvironmentControl envControl; 
    @Autowired 
    private SearchControl searchControl; 
... 

しかし、今、私は何かをスケジュールするためにinitメソッドを使用していますScheduleServletと呼ばれるサーバーの起動クラスに持っている...これで

public class SchedulerServlet extends HttpServlet { 
    @Override 
    public void init(ServletConfig config) throws ServletException { 

    super.init(config); 
    this.LOGGER.info("timer servlet is initialized "); 
    try { 
     InitialContext ic = new InitialContext(); 
     TimerManager tm = (TimerManager) ic.lookup("java:comp/env/tm/TimerManager"); 
     Timer timer = tm.schedule(new GlobalTemplateScheduler(), 0, 3600000);// one hour interval 
     System.out.println("Timer..... " + timer); 
    } 
... 

私GlobalTemplateSchedulerクラスが実行されるようにスケジュールされtimerExpired方法があります1時間間隔ごとに

public class GlobalTemplateScheduler implements TimerListener { 

    @Autowired 
    private TemplateControl templateControl; 

    @Override 
    public void timerExpired(Timer timer) { 
     try { 
      templateControl.updateMappings(names); 
     } catch (Exception e) { 
      this.LOGGER.error(e.getMessage()); 
      e.printStackTrace(); 
     } 
... 

私はnullを取得しているtemplateControlをautowireする必要があります。これはサーバーの起動時に発生します。

さらに内部updateMappingsもコンストラクタ、引数としてautowiredされるデータソースオブジェクトは、(これは、ブラウザのリクエストに応じて細かい作業が、サーバの起動時にそれを実行する必要があります)があります。

注:私はApplicationListenerインタフェースを使用することはできません。

どのような提案が本当に役に立ちます。

ありがとうございます。アプリケーションの起動豆の初期化で

+1

あなたは、newを呼び出すことによってあなたのGlobalTemplateSchedulerをインスタンス化します。これはあなたのコントロール下にあることを意味し、Springのものではありません。既に発見したように、autowiring注釈はそのような場合には何の効果もありません。 GlobalTemplateSchedulerとSchedulerServlet Spring Beanを作成し、注釈を付ける必要があります。ただ注意してください:このアプリケーションをクラスタで実行する場合は、インスタンスごとに1つの「グローバル」スケジューラが必要です。 – duffymo

答えて

0

を使用することができます。スケジューラサーブレットにこれらのBeanが必要でした。

ここで働いていたソリューションは、@Amer Qarabsa @duffymo

ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); 
GlobalTemplateControl globalTemplateControlObject = context.getBean("globalTemplateControl", GlobalTemplateControl.class); 

おかげで...私はアプリケーションコンテキストXMLを持って、必要とされた豆を使用し...私のスケジューラサーブレットで

です@あなたの提案のためのSpindizzy :)

0

が完了されない、豆は、アプリケーションコンテキストの更新後またはBeanの使う初期の後に使用することができますが検出されない限り、それは起動時にBeanを必要とするロジックを実行するために意味をなさないだろうBeanの準備ができているかどうか。

Beanの初期化後に実行されるBeanの@PostConstructを使用してロジックを実行できます。そのため、Beanの初期化後にロジックを操作したり、ロジックを検出して実行したりすることができますApplicationListenerをインプリメントして、ロジックをonAppplicationEventメソッドに入れて、ContextRefreshedEventの後に追加します。

0

一つの解決策は、サーブレット内Springのコンテナを使用することです。この目的のために、例えばAnnotationConfigApplicationContextのような多くのものがある。implementations

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

GlobalTemplateScheduler sheduler = context.getBean("sheduler", GlobalTemplateScheduler.class); 

sheduler.someMethod(); 

ClassPathXmlApplicationContextで使用されるXMLの含有量が少ない:春のマニュアルがClassPathXmlApplicationContext

と仮定GlobalTemplateSchedulerもBeanで使用する方法について説明し、その後、キーポイントはこれです。しかし、あなたはコンポーネント・スキャンを有効にする必要があります。

<context:component-scan base-package="foo.bar.baz" /> 

別のアプローチは、私が提案することができ、一緒にすべてのBeanを配線するSpringののDispatcherServletを使用することです。同じXMLを使用できますが、ロードするだけです。利点は、それはあなたが

は、このサーブレットを使用する方法のチュートリアルがたくさんありますエントリポイントとして豆を自分でアプリケーションコンテキストをロードして起動する必要はありませんです。

あなたはXMLを書くのが好きdont't場合、私はオートワイヤリングされた豆が正常に動作して言ったように、あなたはWebApplicationInitializer

関連する問題