2012-09-26 139 views

回答

4

你所做的只是在這裏創建一個對象。您需要檢索這些bean然後使用它們。例如

ApplicationContext ctx = new ClassPathXmlApplicationContext("/springtests/test01.xml"); 
MyClass myObj= MyClass.class.cast(ctx.getBean("myBeanName"));   
myObj.doStuff(); 

如果你想那麼更多的幫助張貼什麼是你test01.xml

0

您可以撥打context.registerShutdownHook()確保that the beans in the applicationContext are shut down properly,但你仍然需要確保主線程不會退出,如果applicationContext只啓動守護進程線程。

更好的策略是:main()從上下文中檢索一些bean,它可以調用bean.startApp(),或者至少有一個在上下文中啓動的線程是非守護進程。

1

雖然我同意其他答案中的大部分建議,但我認爲你的主要方法是可以的。你唯一需要改變的是至少讓你的一個工作線程不守護進程。

從Thread.setDaemon Java文檔:

Java虛擬機退出時正在運行的線程都是守護線程。

還要確保您的所有線程都是在bean的init方法(或afterPropertiesSet)期間啓動的,並且不需要啓動bean(實現生命週期接口)。你有它的方式編碼所有的豆將被初始化,但沒有開始。

1

如何等待或什麼?

我已經使用了類似下面的模式。我的Main線程啓動上下文,然後等待其他人調用Main.shutdownLatch.countDown()命令告訴它關閉上下文並退出。我通常使用JMX命令來執行此操作。

public static CountDownLatch shutdownLatch = new CountDownLatch(1); 
public static void main(String[] args) { 
    ApplicationContext context = 
     new ClassPathXmlApplicationContext("/springtests/test01.xml"); 
    try { 
     shutdownLatch.await(); 
    } finally { 
     context.close(); 
    } 
} 
+1

任何人都想解釋-1? – Gray

0

你可以有你的bean實現ApplicationListener<ContextStartedEvent>即:

@Override 
public final void onApplicationEvent(ContextStartedEvent event) {... 

,也許還ExitCodeGenerator

@Override 
public int getExitCode() { 

然後你的主要方法可以是:

public static void main(String[] args) { 
    try (ConfigurableApplicationContext context = SpringApplication.run(AppConfig.class, args)) { 
     context.start(); 
     System.exit(SpringApplication.exit(context)); 
    } 
} 
0

在初始化彈簧上下文後,請在單獨的線程中執行邏輯。當新的線程啓動,可以等待一個條件,主線程將完成,而你的邏輯仍然在另一個線程中運行。該線程可以通過JMX更新變量值來停止。

ApplicationContext ctx = new ClassPathXmlApplicationContext("/springtests/test01.xml"); 
MyClass myObj= MyClass.class.cast(ctx.getBean("myBeanName")); 

ExecutorService executor= Executors.newSingleThreadExecutor(); 
     executor.submit(new Runnable() { 

      @Override 
      public void run() { 
//Update the value of this variable via jmx 
while(<SomeAtomicBooleanValueCheck>) 
{ 
       myObj.doStuff(); 
} 
          } 
     }) 
相關問題