在 xml 配置了这个标签后,spring 可以自动去扫描 base-pack 下面或者子包下面的 java 文件,如果扫描到有 @Component @Controller@Service 等这些注解的类,则把这些类注册为 bean
注意:如果配置了 <context:component-scan>
那么 <context:annotation-config/>
标签就可以不用再 xml 中配置了,因为前者包含了后者。另外 <context:component-scan>
还提供了两个子标签
1. <context:include-filter>
2. <context:exclude-filter>
在说明这两个子标签前,先说一下 <context:component-scan>
有一个 use-default-filters 属性,改属性默认为 true,这就意味着会扫描指定包下的全部的标有 @Component 的类,并注册成 bean.也就是 @Component 的子注解 @Service,@Reposity 等。所以如果仅仅是在配置文件中这么写
<context:component-scan base-package="com.oagnahz"/>
Use-default-filter
此时为 true 那么会对 base-package 包或者子包下的所有的进行 java 类进行扫描,并把匹配的 java 类注册成 bean。
可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的 Controller,该怎么办?此时子标签就起到了勇武之地。如下所示
<context:component-scan base-package="com.oagnahz.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
这样就会只扫描 base-package 指定下的有 @Controller 下的 java 类,并注册成 bean
但是因为 use-dafault-filter 在上面并没有指定,默认就为 true,所以当把上面的配置改成如下所示的时候,就会产生与你期望相悖的结果(注意 base-package 包值得变化)
<context:component-scan base-package="com.oagnahz">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
此时,spring 不仅扫描了 @Controller,还扫描了指定包所在的子包 service 包下注解 @Service 的 java 类
此时指定的 include-filter 没有起到作用,只要把 use-default-filter
设置成 false 就可以了。这样就可以避免在 base-packeage 配置多个包名这种不是很优雅的方法来解决这个问题了。
另外在我参与的项目中可以发现在 base-package 指定的包中有的子包是不含有注解了,所以不用扫描,此时可以指定来进行过滤,说明此包不需要被扫描。综合以上说明
Use-dafault-filters=”false”的情况下:<context:exclude-filter>
指定的不扫描,<context:include-filter>
指定的扫描
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于