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

Java Spring应用程序最简单的main()方法是什么?,java,spring,main,Java,Spring,Main,我写了以下内容,但它立即退出: public static void main(String[] args) { new ClassPathXmlApplicationContext("/springtests/test01.xml"); } test01.xml包含多个bean,其中包含一些连接到网络等的线程(守护进程) 如何等待或做些什么?您所做的就是在这里创建一个对象。您需要检索bean,然后使用它们。比如说 ApplicationContext ctx = new ClassP

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

public static void main(String[] args) {
    new ClassPathXmlApplicationContext("/springtests/test01.xml");
}
test01.xml
包含多个bean,其中包含一些连接到网络等的线程(守护进程)


如何等待或做些什么?

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

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

如果需要更多帮助,请发布test01.xml中的内容,您可以调用
context.registerShutdownHook()
来确保,但如果applicationContext仅启动守护程序线程,则仍然需要确保主线程不会退出


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

尽管我同意其他答案中的大多数建议,我认为你的主要方法是好的,因为它是。唯一需要更改的是使至少一个工作线程成为非守护进程

从Thread.setDaemon Java文档:

当运行的线程都是守护进程线程时,Java虚拟机将退出

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

怎么等啊

我使用了如下模式。我的
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();
    }
}

您可以让bean实现
ApplicationListener
,即:

@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));
    }
}

初始化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();
}
                            }
        })
ApplicationContext ctx=new ClassPathXmlApplicationContext(“/springtests/test01.xml”);
MyClass myObj=MyClass.class.cast(ctx.getBean(“myBeanName”);
ExecutorService executor=Executors.newSingleThreadExecutor();
执行者提交(新的可运行(){
@凌驾
公开募捐{
//通过jmx更新此变量的值
while()
{
myObj.doStuff();
}
}
})

有人想解释-1吗?