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