xml文件的包扫描

原来使用xml方式进行包扫描时是这么使用的:

<context:component-scan base-package="com.dongguabai"/>

根据实际情况有时也会将Controller组件和其他组件分开:

springmvc.xml中:

Spring学习(一)Spring注解驱动开发(2)_数组

applicationContext.xml中:

Spring学习(一)Spring注解驱动开发(2)_数组_02

@ComponentScan注解方式进行包扫描

在配置类中:

Spring学习(一)Spring注解驱动开发(2)_数组_03

测试看看:

Spring学习(一)Spring注解驱动开发(2)_多实例_04

@Test
public void test01(){
//获取ioc容器
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
//获取所有组件的名称
String[] names = applicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}

测试结果:

Spring学习(一)Spring注解驱动开发(2)_多实例_05

上面是Spring IOC容器自己要装配的一些组件;

发现myConfig也是组件,但是在myConfig上的注解是这么几个:

Spring学习(一)Spring注解驱动开发(2)_数组_06

再看看@Configuration这个注解的源码:

Spring学习(一)Spring注解驱动开发(2)_多实例_07

显然被@Configuration声明的类也是Spring的组件。

 

@ComponentScan的其他属性(过滤)

过滤规则有很多,这里简单介绍两个:

Spring学习(一)Spring注解驱动开发(2)_xml_08

includeFilters是扫描的时候只包含哪些,excludeFilters是扫描的时候排除哪些。它们的值都是一个Filer数组,看看Filer数组是什么:

Spring学习(一)Spring注解驱动开发(2)_数组_09

是@Filter注解,看看这个注解的写法:

可以定义排除规则,可以按注解排除,也可以按类排除等等,是类就是类的Class,是注解就是注解的Class:

Spring学习(一)Spring注解驱动开发(2)_数组_10

例如这里排除@Controller注解:

Spring学习(一)Spring注解驱动开发(2)_xml_11

再测试看看,少了@Controllr的组件:

Spring学习(一)Spring注解驱动开发(2)_数组_12

再来测试只包含@Controller的注解,这里要注意的是要加上useDefaultFilters=false,即关闭默认的过滤规则:

Spring学习(一)Spring注解驱动开发(2)_数组_13

再看看@ComponentScan注解:

Spring学习(一)Spring注解驱动开发(2)_多实例_14

说明它是支持重复注解的,也就是说可以多个@ComponentScan一起使用,不过这个要jdk1.8以上才支持,在使用的时候要注意的是根据反射获取注解的属性值的时候会有点小变化,具体简单测试下就行了。

@Scope

这个注解放在Spring组件上可以控制该组件是单实例还是多实例,作用域等等,和xml文件中的那个属性是一样的。

要注意的是:Spring  IOC容器启动,在多实例下,只有在用到的时候才会去创建,而在单实例下,是IOC容器启动就会去创建。