Spring应用程序的最简单的main()方法是什么?

时间:2012-09-26 18:04:50

标签: java spring main

我写了以下内容,但它会立即退出:

public static void main(String[] args) {
    new ClassPathXmlApplicationContext("/springtests/test01.xml");
}

test01.xml包含多个bean,其中包含一些连接到网络的线程(守护程序)等。

如何等待或什么?

6 个答案:

答案 0 :(得分:4)

你要做的就是在这里创建一个对象。您需要检索bean然后使用它们。例如

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

如果您需要更多帮助,请发布test01.xml中的内容

答案 1 :(得分:1)

虽然我同意其他答案中的大多数建议,但我认为你的主要方法是可行的。您需要更改的唯一事情是使至少一个工作线程非守护进程。

来自Thread.setDaemon Java doc:

  

当运行的唯一线程都是守护程序线程时,Java虚拟机退出。

还要确保在bean的init方法(或afterPropertiesSet)期间启动所有线程,并且不需要启动bean(实现生命周期接口)。您对所有bean进行编码的方式将被初始化但不会启动。

答案 2 :(得分: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();
    }
}

答案 3 :(得分:0)

您可以调用context.registerShutdownHook()以确保that the beans in the applicationContext are shut down properly,但是如果applicationContext仅启动守护程序线程,您仍需要确保主线程不会退出。

更好的策略是main()从它可以调用bean.startApp()的上下文中检索一些bean,启动它 - 或者至少有一个线程在上下文中启动非守护。

答案 4 :(得分: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));
    }
}

答案 5 :(得分:0)

初始化spring上下文后,在单独的线程中执行逻辑。当新线程启动时可以等待一个条件,主线程将在你的逻辑仍在另一个线程中运行时完成。可以通过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();
}
                            }
        })