2016-08-11 39 views
0

我有一个问题,与我的项目与应用程序上下文了解实际发生了什么。我创建项目的新的组成部分,其使用弹簧MVCweb.xml中的contextConfigLocation初始化参数

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上下文能否成为根上下文的一部分?如果是的话,我的控制器,服务等将创建两次?

如果我在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.s[email protected]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"] 

回答

1

日志的一部分从我了解你的代码,您所指定的所有的bean应该通过上下文加载器监听器,它就像一个全球范围内,从检索所有调度员servlet都可以检索bean。

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

至于其他问题。目前只有一个bean的定义。如果您决定在顶级上下文(上下文加载器侦听器提供的应用程序上下文)和只能访问您的调度程序servlet的底层上下文之间进行拆分,则应注意不要有2个相同的bean定义。构建上下文的一种方法是按主题拆分它们,并确定哪些仅由您的应用程序的Web方面使用,这些方面是数据库的交叉问题,如日志记录,监视或交易等。没有一种方法可以做到。您可以在应用程序上下文中拥有事务,服务和存储库,而诸如marshallers,转换器,控制器之类的东西则停留在调度程序端。

+0

非常感谢,但在文档中写道,对于每个DispetcherServlet,我应该指定上下文吗?请回答关于这个RestConfig servlet如何初始化的问题,因为我没有在web.xml中指定它?我的RestConfig拿这个? – Alex

+0

对不起RestServlet * servlet不是RestConfig servlet(不允许为我更改注释 – Alex