为什么我在这个java动态Web项目中看不到任何主要方法?

我试图了解Web服务的工作方式,并且我遇到了本教程

现在,我已经看到Spring正在企业应用程序中使用,并且总是想知道主要方法在哪里以及一切如何工作? 每当我去Spring教程时,他们将从beanFactory和Contexts开始,然后不是,所有这些都在一个主java方法中,并且从那里继续按需要获取bean。 这与我在应用程序中看到的完全不同。

有人可以告诉我在这种情况下弹簧是如何工作的。 什么是通话顺序。 我想某处会有一些隐藏的主要方法,但我不确定。

通常如果我从命令行运行一个简单的java项目,我会做java mainClass 。 现在,在这种情况下会发生什么。

谢谢

Web应用程序没有main; 正在运行的“程序”实际上是Web容器(Apache Tomcat,Glassfish,JBoss,Weblogic等),该程序将为您部署到其中的Web应用程序提供服务。 您可能希望阅读JEE教程以了解和理解Java Web环境是什么。

https://docs.oracle.com/javaee/7/tutorial/

还有一个主要方法,它不是由应用程序的开发人员编写的,而是由容器的开发人员编写的。

您仍然可以通过使用调试器来查看调用的main方法,如下所示:

  • 在一些初始化方法中放置断点,例如某些servlet Servlet.init()的init方法
  • 当breapoint命中时,向下滚动调用轨迹,main方法应该在底部。

这是一个docker的例子:

在此处输入图像描述

为了看到这一点,我们需要将断点放在初始化方法中,以便我们获得应用程序的主线程。

将断点放在请求处理而不是初始化方法中会在堆栈跟踪的底部显示Thread.run()而不是main()。

Thread.run()等同于主线程以外的线程的主方法。

因此主要方法仍然存在,它只是在容器级别处理。

您没有看到任何显式的main方法,因为它是一个Web项目。 该项目内置于Web应用程序归档(WAR)文件中,该文件部署到Web服务器/ servlet容器中,例如本教程中的Tomcat。

Web应用程序不必包含main方法。 这是因为您不需要从Web应用程序中显式启动任何Java进程。 在深度的某个地方,Tomcat调用了它构建的代码的main方法。 这在服务器启动时发生。

然后,它会将您的代码绑定到传入的HTTP调用,但它不会启动新的进程。 它宁愿开始新的线程。

Web应用程序不是独立的应用程序,它们在某些应用程序上运行,我们在java上下文中称为servletContainer,因此对于任何Web应用程序都没有main method or java process(os) 。 它们刚刚部署在那些在OS运行时具有main方法和java进程的容器中。