关于use-default-filters属性的说明
----------------------------------------------------------------------------------------------------------------------------------------------------------
笔记中提供了必要的代码⽰例,需要说明的是,⼤部分代码⽰例都是本⼈所敲代码并进⾏测试,不⾜之处,请⼤家指正~
本博客中所有⾔论仅代表博主本⼈观点,若有疑惑或者需要本系列分享中的资料⼯具,敬请联系qingqing_crawl@163
-----------------------------------------------------------------------------------------------------------------------------------------------------------
前⾔:昨天在做⼀个⼩项⽬时先对 SSM 进⾏整合,⼀通配置之后进⾏测试,发现启动 Tomcat 就出错了,错误信息如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could no Caused by: org.springframework.b
eans.factory.BeanCreationException: Could not autowire field: batis.ssm.service.ployeeService; nested exception is org.spri 查看错误信息应该是说没有扫描到楼主的 Service,经过⼀番排查之后,楼主将错误定位到了包扫描的配置上,其实也就是use-default-filters 配置的问题上。
Step 1:先看⼀下楼主的 SpringMVC 和 Spring 的配置⽂件中对包扫描的配置:
SpringMVC:
springframework作用1<!-- 配置⾃动扫描的包 -->
2<context:component-scan base-package="batis.ssm" use-default-filters="false">
3<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
4</context:component-scan>
Spring:
1<!-- 配置⾃动扫描的包 -->
2<context:component-scan base-package="batis.ssm" use-default-filters="false">
3<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
4</context:component-scan>
SpringMVC 主要就是来管理⽹站的跳转逻辑,所以在配置扫描的包时,使⽤ use-default-filters 属性,并设置为 false,即不使⽤默认的 Filter 进⾏扫描。
⽽ Spring 的配置⽂件中,楼主也想当然的配置了 use-default-filters 为 false,正式这个配置,导致出错。
Step 2:错误分析
要分析这个错误,就要先了解 use-default-filters 这个属性的作⽤。use-default-filters 属性的默认值为 true,即使⽤默认的 Filter 进⾏包扫描,⽽默认的 Filter 对标有
@Service,@Controller和@Repository 的注解的类进⾏扫描,因为前⾯说过,我们希望 SpringMVC 只来控制⽹站的跳转逻辑,所以我们只希望 SpringMVC 的配置扫描
@Controllerce 注解标注的类,不希望它扫描其余注解标注的类,所以设置了 use-default-filters 为 false,并使⽤ context:include-filter ⼦标签设置其只扫描带有 @Controller 注解
标注的类。
⽽ Spring 就不同了,我们希望 Spring 只不扫描带有 @Controller 注解标注的类,⽽扫描其他注解标注的类,⽽这时建⽴在使⽤默认的 Filter 进⾏扫描的基础上,设置了
context:exclude-filter 标签,不扫描 @Controller 注解标注的类,所以不应该设置 use-default-filters 为 false,所以这就解释了为什么⼀开始启动 Tomcat 时报了⼀个不到
Service 的错误。
Step 3:总结
在使⽤ use-default-filters 属性时要分清楚需要扫描哪些包,是不是需要使⽤默认的 Filter 进⾏扫描。楼主稍微总结⼀下,即use-default-filters="false" 需要和 context:include-
filter ⼀起使⽤,⽽不能和 context:exclude-filter 属性⼀起使⽤。
Step 4:更正
Spring 的配置⽂件中包扫描配置如下:
1<!-- 配置⾃动扫描的包 -->
2<context:component-scan base-package="batis.ssm">
3<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
4</context:component-scan>
这样更正过来之后,再启动 Tomcat 就没有错误了!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。