在一个项目的编码过程中,我遇到了一个疑问。
我的疑问是,如标题所示,J2EE 应用程序服务器如何为单个 WebService 调用提供服务。
当客户端调用WS时,J2EE AS会创建一个新线程来服务它吗?我不需要担心对 WS 实现的多个同时调用,对吧? (这是Java中的操作和方法)
另一个疑问是关于Spring中的@Autowired(默认是单例实例化)。
在此 Web 应用程序中,我以通常的方式创建 Spring 上下文,在 web.xml 中,我使用 ContextLoaderListener Spring 类放置了引用 context-spring-xml 配置文件的常用标签。
例如:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-conf/spring-context.xml
</param-value>
</context-param>
在这种情况下,对于每个@Autowired(带有单例)的bean,我有整个应用程序服务器的单个实例?或者每次进行 WS 调用时都会创建一个线程,并且单个线程在 spring xml 配置文件中拥有每个定义的 bean 的单个实例?
让我们考虑 ServiceImplementation 类本身就是一个 spring bean,作为单例进行管理。
我们使用 Apache Camel 作为 ESB,将服务 Consumer 公开为 SpringRouteBuilder 类。
当客户端调用WS时,J2EE AS会创建一个新线程来服务它吗?我不需要担心对 WS 实现的多个同时调用,对吗?
对。但你必须担心你的 @Autowired 单例线程安全。 在请求/响应过程中不得使用任何实例变量。它可能只有配置/设置属性。
在这种情况下,对于每个@Autowired(带有单例)的bean,我都有一个用于整个应用程序服务器的实例?
不对。 它不会适用于整个 AS。它在您的网络应用程序的范围内。这就是应用程序之间的隔离。 这意味着当在两个不同的 Web 应用程序的 Spring 上下文中定义相同的 @Autowired 类时(例如两个 WAR 内的 web.xml 中的 spring-context.xml) - 每个应用程序 Spring 上下文将有自己的单例。