SpringMVC和Spring的配置文件掃描包詳解

1、Spring容器

在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

  1. <context:include-filter>
  2. <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 />

2、具體場景分析

咱們共有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跳轉有效。

相關文章
相關標籤/搜索