欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-02 23:38:34
在spring整体框架的核心概念中,容器是核心思想,就是用来管理bean的整个生命周期的,而在一个项目中,容器不一定只有一个,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> 

如图:

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

从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的配置文件扫描包详解,希望对大家有所帮助