2016-08-11 40 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