1. 程式人生 > >springmvc 對應的controller 是否歸spring容器管理

springmvc 對應的controller 是否歸spring容器管理

在做專案時,有時候會遇到springmvc管理的bean和spring容器管理的bean的歸屬問題,是否可以交叉獲取,在此記錄一下一直以來的疑惑。 

SpringMVC管理Controller有兩種方式(題外話:springmvc 通過@RequestMapping(“/memberInfo”) 把url對映關係儲存起來)
controller 預設是單例模式。若是在@controller之前增加@Scope(“prototype”),就可以改變單例模式為多例模式

第一種方式是在SpringMVC 的配置檔案中定義MyController 的bean 物件。

<bean class
="com.host.app.web.controller.MyController"/>

第二種方式是在SpringMVC 的配置檔案中告訴Spring 該到哪裡去找標記為@Controller 的Controller 控制器。

< context:component-scan base-package = "com.host.app.web.controller" >  
   < context:exclude-filter type = "annotation"  
       expression = "org.springframework.stereotype.Service"
/> </ context:component-scan >
注:
   上面 context:exclude-filter 標註的是不掃描 @Service 標註的類

在解決這個問題之前,先要弄清楚,spring上下文和SpringMVC上下文。
先看配置,Spring上下文配置,在Web.xml裡

<context-param>    
    <param-name>contextConfigLocation</param-name>    
    <param-value>classpath:resources/spring.xml</param
-value> </context-param>
<!-- Spring監聽器 -->    
<listener>    
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
</listener>  

spring.xml裡面配置的bean屬於Spring上下文。
SpringMVC上下文配置,在Web.xml裡

<!-- Spring MVC servlet -->    
    <servlet>    
        <servlet-name>SpringMVC</servlet-name>    
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
        <init-param>    
            <param-name>contextConfigLocation</param-name>    
            <param-value>classpath:resources/spring-mvc.xml</param-value>    
        </init-param>    
        <load-on-startup>1</load-on-startup>    
        <async-supported>true</async-supported>    
    </servlet>  

spring-mvc.xml裡面配置的bean屬於SpringMVC上下文。

注意:SpringMVC上下文和Spring上下文是分開獨立,兩者是父子關係,Spring 父<->SpringMVC 子,但是SpringMVC上下文是可以取得Spring上下文,反之則不行。
controller 中service注入 是有spring注入的,跟spring容器管理bean是兩碼事。
spring容器初始化時間較早:spring容器初始化是通過監聽器;springmvc初始化是通過servlet。

注意:開發時一定要注意,管理我們controller例項,是有springMVC ,還是有spring。