SpringMVC和Spring的配置文件扫描包详解
在spring整体框架的核心概念中,容器是核心思想,就是用来管理bean的整个生命周期的,而在一个项目中,容器不一定只有一个,spring中可以包括多个容器,而且容器有上下层关系,目前最常见的一种场景就是在一个项目中引入spring和springmvc这两个框架,那么它其实就是两个容器,spring是父容器,springmvc是其子容器,并且在spring父容器中注册的bean对于springmvc容器中是可见的,而在springmvc容器中注册的bean对于spring父容器中是不可见的,也就是子容器可以看见父容器中的注册的bean,反之就不行。
我们可以使用统一的如下注解配置来对bean进行批量注册,而不需要再给每个bean单独使用xml的方式进行配置。
<context:component-scan base-package="com.springmvc.test" />
(在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@component @controller@service等这些注解的类,则把这些类注册为bean)
(另外<context:component-scan>还提供了两个子标签
<context:include-filter>
<context:exclude-filter>
在说明这两个子标签前,先说一下<context:component-scan>有一个use-default-filters属性,该属性默认为true,这就意味着会扫描指定包下的全部的标有@component的类,并注册成bean.也就是@component的子注解@service,@reposity等。所以如果仅仅是在配置文件中这么写
<context:component-scan base-package="tv.huan.weisp.web"/>
use-default-filter此时为true那么会对base-package包或者子包下的所有的进行java类进行扫描,并把匹配的java类注册成bean。
可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的controller,该怎么办?此时子标签<context:incluce-filter>就起到了勇武之地。
如下所示
<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跳转有效。
总结
以上所述是小编给大家介绍的springmvc和spring的配置文件扫描包详解,希望对大家有所帮助