SpringMVC和Spring的配置文件扫描包详解

在Spring总体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不必定只有一个,Spring中能够包括多个容器,并且容器有上下层关系,目前最多见的一种场景就是在一个项目中引入Spring和SpringMVC这两个框架,那么它其实就是两个容器,Spring是父容器,SpringMVC是其子容器,而且在Spring父容器中注册的Bean对于SpringMVC容器中是可见的,而在SpringMVC容器中注册的Bean对于Spring父容器中是不可见的,也就是子容器能够看见父容器中的注册的Bean,反之就不行。java

咱们可使用统一的以下注解配置来对Bean进行批量注册,而不须要再给每一个Bean单独使用xml的方式进行配置。web

1
<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>json

2. <context:exclude-filter>mvc

在说明这两个子标签前,先说一下<context:component-scan>有一个use-default-filters属性,该属性默认为true,这就意味着会扫描指定包下的所有的标有@Component的类,并注册成bean.也就是@Component的子注解@Service,@Reposity等。因此若是仅仅是在配置文件中这么写app

<context:component-scan base-package="tv.huan.weisp.web"/>框架

Use-default-filter此时为true那么会对base-package包或者子包下的全部的进行java类进行扫描,并把匹配的java类注册成bean。ui

能够发现这种扫描的粒度有点太大,若是你只想扫描指定包下面的Controller,该怎么办?此时子标签<context:incluce-filter>就起到了勇武之地。调试

以下所示

1
2
3
4
5
<context:component-scan base- package = "tv.huan.weisp.web .controller" >
<context:include-filter type= "annotation" expression= "org.springframework.stereotype.Controller" />
</context:component-scan>

  

如图:

从Spring提供的参考手册中咱们得知该配置的功能是扫描配置的base-package包下的全部使用了@Component注解的类,而且将它们自动注册到容器中,同时也扫描@Controller,@Service,@Respository这三个注解,由于他们是继承自@Component。

在项目中咱们常常见到还有以下这个配置,其实有了上面的配置,这个是能够省略掉的,由于上面的配置会默认打开如下配置。如下配置会默认声明了@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。

1.在applicationContext.xml中配置了<context:component-scan base-package=“com.springmvc" />,负责全部须要注册的Bean的扫描和注册工做。

2.在applicationContext-MVC.xml中配置,负责SpringMVC相关注解的使用。

3.启动项目咱们发现SpringMVC没法进行跳转,将log的日志打印级别设置为DEBUG进行调试,发现SpringMVC容器中的请求好像没有映射到具体controller中。

4.在applicationContext-MVC.xml中配置<context:component-scan base-package=“com.springmvc" />,重启后,验证成功,springMVC跳转有效。

相关文章
相关标签/搜索