java - web.xml 中的 contextConfigLocation 初始化参数

标签 java spring spring-mvc servlets

我无法理解我的项目中应用程序上下文实际发生的情况。我已经创建了使用 spring-mvc 的项目的新部分

enter image description here

有 RestConfig类

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "restService.com.websystique.springmvc.*")
public class RestConfig {
}

RestServlet 类

@WebServlet(name = "PSC Rest Servlet", urlPatterns = "/rest/*", loadOnStartup = 1)

    public class RestServlet extends DispatcherServlet {
        public RestServlet() {
            super(new GenericWebApplicationContext());
        }
    }

如您所见,这些类是 servlet 及其配置。

一切正常

在整个项目的 web.xml 下方

<?xml ...>
    ...another code
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            com.psc.config.JpaConfig, com.psc.config.ServicesConfig, restService.com.websystique.springmvc.configuration.RestConfig
        </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


...another code
</web-app>

我想知道我的 RestConfig 上下文如何识别 servlet RestServlet(因为一切正常)。我已经在 context-param 中指定了 RestConfig,那么它的文件将成为根上下文的一部分。

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            com.psc.config.JpaConfig, com.psc.config.ServicesConfig, restService.com.websystique.springmvc.configuration.RestConfig
        </param-value>
    </context-param>

但是 RestServlet 上下文在哪里?如果 RestConfig 是 RestServlet 上下文,为什么它是根上下文的一部分? servlet 上下文可以成为根上下文的一部分吗?如果是,我的 Controller 、服务等将创建两次?

如果我在 web.xml 中指定 servlet,并且不在整个应用程序的 init-param(context-param) 中包含 RestConfig,我会做出好事,否则不会进行任何更改?

这是登录控制台的一部分

11:27:01.183 [localhost-startStop-1] INFO  o.s.web.context.ContextLoader - Root WebApplicationContext: initialization started
11:27:01.369 [localhost-startStop-1] INFO  o.s.w.c.s.AnnotationConfigWebApplicationContext - Refreshing Root WebApplicationContext: startup date [Thu Aug 11 11:27:01 MSK 2016]; root of context hierarchy
11:27:01.478 [localhost-startStop-1] INFO  o.s.w.c.s.AnnotationConfigWebApplicationContext - Successfully resolved class for [com.psc.config.JpaConfig]
11:27:01.553 [localhost-startStop-1] INFO  o.s.w.c.s.AnnotationConfigWebApplicationContext - Successfully resolved class for [com.psc.config.ServicesConfig]
11:27:01.579 [localhost-startStop-1] INFO  o.s.w.c.s.AnnotationConfigWebApplicationContext - Successfully resolved class for [restService.com.websystique.springmvc.configuration.RestConfig]
11:27:02.843 [localhost-startStop-1] INFO  o.s.b.f.a.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
11:27:03.269 [localhost-startStop-1] INFO  o.s.o.j.LocalContainerEntityManagerFactoryBean - Building JPA container EntityManagerFactory for persistence unit 'psc'
11:27:17.430 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/branch/{id}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.Branch>> restService.com.websystique.springmvc.controller.BranchController.getBranchesWithId(java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.432 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/branch],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.Branch>> restService.com.websystique.springmvc.controller.BranchController.getBranches(java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.434 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/region/{id}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.Region>> restService.com.websystique.springmvc.controller.RegionController.getBranchesWithId(java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.435 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/region],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.Region>> restService.com.websystique.springmvc.controller.RegionController.getBranches(java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.436 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/region/ || /region],methods=[POST]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.Region>> restService.com.websystique.springmvc.controller.RegionController.createUser(com.psc.model.Region)
11:27:17.436 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/region/{id}],methods=[DELETE]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.Region>> restService.com.websystique.springmvc.controller.RegionController.deleteRegionById(long)
11:27:17.438 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/role/{id}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.Role>> restService.com.websystique.springmvc.controller.RoleController.getBranchesWithId(java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.439 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/role],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.Role>> restService.com.websystique.springmvc.controller.RoleController.getBranches(java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.439 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/role/ || /role],methods=[POST]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.Role>> restService.com.websystique.springmvc.controller.RoleController.createUser(com.psc.model.Role)
11:27:17.442 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/roleTree/{id}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.RoleTree>> restService.com.websystique.springmvc.controller.RoleTreeController.getBranchesWithId(java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.443 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/roleTree],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.RoleTree>> restService.com.websystique.springmvc.controller.RoleTreeController.getBranches(java.lang.Long,java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.443 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/roleTree/ || /roleTree],methods=[POST]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.RoleTree>> restService.com.websystique.springmvc.controller.RoleTreeController.createUser(com.psc.model.RoleTree)
11:27:17.444 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/user/{id}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.User>> restService.com.websystique.springmvc.controller.UserController.getBranchesWithId(java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.445 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/user],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.User>> restService.com.websystique.springmvc.controller.UserController.getBranches(java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.446 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/user/ || /user],methods=[POST]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.User>> restService.com.websystique.springmvc.controller.UserController.createUser(com.psc.model.User)
11:27:17.449 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/userRole/{id}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.UserRole>> restService.com.websystique.springmvc.controller.UserRoleController.getBranchesWithId(java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.450 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/userRole],methods=[GET]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.UserRole>> restService.com.websystique.springmvc.controller.UserRoleController.getBranches(java.lang.Long,java.lang.Long,javax.servlet.http.HttpServletRequest)
11:27:17.451 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped "{[/userRole/ || /userRole],methods=[POST]}" onto public org.springframework.http.ResponseEntity<restService.com.websystique.springmvc.model.Box<com.psc.model.UserRole>> restService.com.websystique.springmvc.controller.UserRoleController.createUser(com.psc.model.UserRole)
11:27:18.091 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.RequestMappingHandlerAdapter - Looking for @ControllerAdvice: Root WebApplicationContext: startup date [Thu Aug 11 11:27:01 MSK 2016]; root of context hierarchy
11:27:18.249 [localhost-startStop-1] INFO  o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Detected @ExceptionHandler methods in tempControllerAdvice
11:27:18.330 [localhost-startStop-1] INFO  o.s.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 17137 ms
11:27:18.419 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Installed AtmosphereHandler com.vaadin.server.communication.PushAtmosphereHandler mapped to context-path: /*
11:27:18.420 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Installed the following AtmosphereInterceptor mapped to AtmosphereHandler com.vaadin.server.communication.PushAtmosphereHandler
11:27:18.430 [localhost-startStop-1] INFO  org.atmosphere.util.IOUtils - META-INF/services/org.atmosphere.cpr.AtmosphereFramework not found in class loader
11:27:18.466 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Atmosphere is using org.atmosphere.util.VoidAnnotationProcessor for processing annotation
11:27:18.497 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Installed WebSocketProtocol org.atmosphere.websocket.protocol.SimpleHttpProtocol 
11:27:18.522 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Installing Default AtmosphereInterceptors
11:27:18.524 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework -   org.atmosphere.interceptor.CorsInterceptor : CORS Interceptor Support
11:27:18.524 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework -   org.atmosphere.interceptor.CacheHeadersInterceptor : Default Response's Headers Interceptor
11:27:18.526 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework -   org.atmosphere.interceptor.PaddingAtmosphereInterceptor : Browser Padding Interceptor Support
11:27:18.527 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework -   org.atmosphere.interceptor.AndroidAtmosphereInterceptor : Android Interceptor Support
11:27:18.527 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Dropping Interceptor org.atmosphere.interceptor.HeartbeatInterceptor
11:27:18.528 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework -   org.atmosphere.interceptor.SSEAtmosphereInterceptor : SSE Interceptor Support
11:27:18.529 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework -   org.atmosphere.interceptor.JSONPAtmosphereInterceptor : JSONP Interceptor Support
11:27:18.532 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework -   org.atmosphere.interceptor.JavaScriptProtocol : Atmosphere JavaScript Protocol
11:27:18.533 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework -   org.atmosphere.interceptor.WebSocketMessageSuspendInterceptor : org.atmosphere.interceptor.WebSocketMessageSuspendInterceptor
11:27:18.535 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework -   org.atmosphere.interceptor.OnDisconnectInterceptor : Browser disconnection detection
11:27:18.536 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework -   org.atmosphere.interceptor.IdleResourceInterceptor : org.atmosphere.interceptor.IdleResourceInterceptor
11:27:18.537 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Set org.atmosphere.cpr.AtmosphereInterceptor.disableDefaults to disable them.
11:27:18.545 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Using EndpointMapper class org.atmosphere.util.DefaultEndpointMapper
11:27:18.545 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Using BroadcasterCache: org.atmosphere.cache.UUIDBroadcasterCache
11:27:18.546 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Default Broadcaster Class: org.atmosphere.cpr.DefaultBroadcaster
11:27:18.547 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Broadcaster Polling Wait Time 100
11:27:18.547 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Shared ExecutorService supported: true
11:27:18.548 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Messaging Thread Pool Size: Unlimited
11:27:18.548 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Async I/O Thread Pool Size: 200
11:27:18.548 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Using BroadcasterFactory: org.atmosphere.cpr.DefaultBroadcasterFactory
11:27:18.548 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Using WebSocketProcessor: org.atmosphere.websocket.DefaultWebSocketProcessor
11:27:18.549 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Invoke AtmosphereInterceptor on WebSocket message true
11:27:18.549 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - HttpSession supported: true
11:27:18.549 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Atmosphere is using DefaultAtmosphereObjectFactory for dependency injection and object creation
11:27:18.550 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Atmosphere is using async support: org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket running under container: Apache Tomcat/7.0.47 using javax.servlet/3.0
11:27:18.550 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Atmosphere Framework 2.2.7.vaadin1 started.
11:27:18.555 [localhost-startStop-1] INFO  o.atmosphere.cpr.AtmosphereFramework - Installed AtmosphereInterceptor  Track Message Size Interceptor using | with priority BEFORE_DEFAULT 
11:27:18.579 [localhost-startStop-1] INFO  o.a.c.c.C.[.[.[/ProductCatalog] - Initializing Spring FrameworkServlet 'PSC Rest Servlet'
11:27:18.580 [localhost-startStop-1] INFO  r.c.w.springmvc.RestServlet - FrameworkServlet 'PSC Rest Servlet': initialization started
11:27:18.584 [localhost-startStop-1] INFO  o.s.w.c.s.GenericWebApplicationContext - Refreshing org.springframework.web.context.support.GenericWebApplicationContext@274638b4: startup date [Thu Aug 11 11:27:18 MSK 2016]; parent: Root WebApplicationContext
11:27:18.602 [localhost-startStop-1] INFO  r.c.w.springmvc.RestServlet - FrameworkServlet 'PSC Rest Servlet': initialization completed in 22 ms
11:27:18.631 [main] INFO  o.a.coyote.http11.Http11Protocol - Starting ProtocolHandler ["http-bio-8080"]

最佳答案

根据我对代码的理解,您已指定应通过上下文加载监听器检索所有 bean,该监听器的作用类似于全局上下文,所有调度程序 servlet 都可以从中检索 bean。

通常,调度程序 servlet 由 XML 上下文支持,其默认文件名源自您在 web.xml 中为 servlet 指定的名称。如果调度程序 Servlet 名为 dispatcher,则文件名为 dispatcher-servlet.xml。由于您没有为 PSC Rest Servlet 声明任何特定上下文,因此您只能从顶级上下文中受益。

至于你剩下的问题。目前,您的 bean 只有一种定义。如果您决定在顶级上下文(由上下文加载监听器提供的应用程序上下文)和只能由您的调度程序 servlet 访问的较低级别上下文之间进行划分,那么您应该注意不要对同一个 bean 有 2 个定义。构建上下文的一种方法是按主题拆分它们,并决定哪些仅由应用程序的 Web 部分使用,哪些用于数据库,哪些是横切关注点,例如日志记录、监控或事务...没有单一的方法可以做到这一点。您可以在应用程序上下文中拥有事务、服务和存储库,而编码器、转换器、 Controller 等内容则保留在调度程序端。

关于java - web.xml 中的 contextConfigLocation 初始化参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38894431/

相关文章:

java - 如何在VS Code中设置JAVA环境变量

java - 如何拦截 Kotlin 协程?

java - Android:检测用户是否停止使用他的手机一段时间

java - Spring Boot 和解析资源

java - Spring 2.5 中的拦截器

java - 如何使 Spring 复选框默认选中?

java - Play Framework : Best practice for validation errors redirect

java - 创建名称为 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0 的 bean 时出错

java - 用 Java 编写通用代码

java - Web 应用程序中的 Spring 线程