组件扫描配置
这里我们通过两个例子来讲解组件扫描配置:
第一个:
<context:component-scan base-package="com.ffyc.spring" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
-
我们能看到,组件扫描标签是在context名称空间下面的
-
base-package : 要进行扫描的包
-
use-default-filters : 设置是否进行默认过滤
- 默认情况下use-default-filter值为true, 那么就是用的默认过滤方式, 也就是扫描base-package包下的所有带@component, @Service, @Controller, @Repository注解的类(也就是默认全扫描), 而我们将use-default-filters属性设置为false之后, 我们就可以使用一个子标签(context名称空间之下的include-filter标签)来定义自定义规则, include-filter是指明要对那些进行扫描
- 我们能看到我们此时context:include-filter子标签中type为annotation, 而expression为org.springframework.stereotype.Controller, 表示的就是扫描指定包下的org.springframework.stereotype.Controller注解
-
我们可以很快的做一个测试, 我们试一下是否使用这种方式Spring就不会扫描base-package中的@Service等注解了
-
创建一个UesrService类:
package com.ffyc.spring.service; import org.springframework.stereotype.Service; @Service public class UserService { }
-
创建一个测试类:
public void test6(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); //获取对应的bean实例并打印 UserService userService = applicationContext.getBean("userService", UserService.class); System.out.println(userService); }
-
这里会报一个异常, 就是因为此时我们的SpringIOC容器并没有创建该UserService对象, 但是你却使用getBean()方法要获取该对象, 异常信息如下:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userService' available
-
-
第二个:
<context:component-scan base-package="com.ffyc.spring">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
- 这里我们并没有将use-default-filters属性值设置为false, 也就是使用的是默认的全扫描
- 这里我们使用到了component-scan标签的另一个子标签exclude-filter, 这个标签表示的是将那些内容去除掉, 这里我们的exclude-filter标签中的type为annotation, expression为org.springframework.stereotype.Controller, 所以就是表示默认扫描base-package的@Service注解, @Component注解, @Repository注解, 但是不扫描@Controller注解
- 这里我们如果想测试的也可以做一个测试, 先测试是否能扫描到base-package之下的@Service注解, @Component注解, @Repository注解, 然后测试能否扫描到base-package之下的@Controller注解 —> 最终的结果肯定是没有扫描@Controller注解