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跳转有效。

相关文章
相关标签/搜索