在Spring總體框架的核心概念中,容器是核心思想,就是用來管理Bean的整個生命週期的,而在一個項目中,容器不必定只有一個,Spring中能夠包括多個容器,並且容器有上下層關係,目前最多見的一種場景就是在一個項目中引入Spring和SpringMVC這兩個框架,那麼它其實就是兩個容器,Spring是父容器,SpringMVC是其子容器,而且在Spring父容器中註冊的Bean對於SpringMVC容器中是可見的,而在SpringMVC容器中註冊的Bean對於Spring父容器中是不可見的,也就是子容器能夠看見父容器中的註冊的Bean,反之就不行。java
咱們能夠使用統一的以下註解配置來對Bean進行批量註冊,而不須要再給每一個Bean單獨使用xml的方式進行配置。web
<context:component-scan base-package="com.springmvc.test" />
(在xml配置了這個標籤後,spring能夠自動去掃描base-pack下面或者子包下面的java文件,若是掃描到有@Component @Controller@Service等這些註解的類,則把這些類註冊爲bean)spring
(另外<context:component-scan>還提供了兩個子標籤express
<context:include-filter>
<context:exclude-filter>
在說明這兩個子標籤前,先說一下<context:component-scan>有一個use-default-filters屬性,該屬性默認爲true,這就意味着會掃描指定包下的所有的標有@Component的類,並註冊成bean.也就是@Component的子註解@Service,@Reposity等。因此若是僅僅是在配置文件中這麼寫json
<context:component-scan base-package="tv.huan.weisp.web"/>
Use-default-filter此時爲true那麼會對base-package包或者子包下的全部的進行java類進行掃描,並把匹配的java類註冊成bean。mvc
能夠發現這種掃描的粒度有點太大,若是你只想掃描指定包下面的Controller,該怎麼辦?此時子標籤<context:incluce-filter>就起到了勇武之地。app
以下所示框架
<context:component-scan base-package="tv.huan.weisp.web .controller"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
如圖:ui
從Spring提供的參考手冊中咱們得知該配置的功能是掃描配置的base-package包下的全部使用了@Component註解的類,而且將它們自動註冊到容器中,同時也掃描@Controller,@Service,@Respository這三個註解,由於他們是繼承自@Component。spa
在項目中咱們常常見到還有以下這個配置,其實有了上面的配置,這個是能夠省略掉的,由於上面的配置會默認打開如下配置。如下配置會默認聲明瞭@Required、@Autowired、 @PostConstruct、@PersistenceContext、@Resource、@PreDestroy等註解。
<context:annotation-config/>(可省略) 由於有了<context:component-scan base-package="com.springmvc.test" />配置
另外,還有一個和SpringMVC相關以下配置,通過驗證,這個是SpringMVC必需要配置的,由於它聲明瞭@RequestMapping、@RequestBody、@ResponseBody等。而且,該配置默認加載不少的參數綁定方法,好比json轉換解析器等。
<mvc:annotation-driven />
咱們共有Spring和SpringMVC兩個容器,它們的配置文件分別爲applicationContext.xml和applicationContext-MVC.xml。
一、在applicationContext.xml中配置了<context:component-scan base-package=「com.springmvc" />,負責全部須要註冊的Bean的掃描和註冊工做。
二、在applicationContext-MVC.xml中配置,負責SpringMVC相關注解的使用。
三、啓動項目咱們發現SpringMVC沒法進行跳轉,將log的日誌打印級別設置爲DEBUG進行調試,發現SpringMVC容器中的請求好像沒有映射到具體controller中。
四、在applicationContext-MVC.xml中配置<context:component-scan base-package=「com.springmvc" />,重啓後,驗證成功,springMVC跳轉有效。