xml文件的包扫描 原来使用xml方式进行包扫描时是这么使用的: context:component-scan base-package="com.dongguabai"/ 根据实际情况有时也会将Controller组件和其他组件分开: springmvc.xml中: applicati
xml文件的包扫描
原来使用xml方式进行包扫描时是这么使用的:
<context:component-scan base-package="com.dongguabai"/>根据实际情况有时也会将Controller组件和其他组件分开:
springmvc.xml中:
applicationContext.xml中:
@ComponentScan注解方式进行包扫描
在配置类中:
测试看看:
@Testpublic void test01(){ //获取ioc容器 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class); //获取所有组件的名称 String[] names = applicationContext.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); }}测试结果:
上面是Spring IOC容器自己要装配的一些组件;
发现myConfig也是组件,但是在myConfig上的注解是这么几个:
再看看@Configuration这个注解的源码:
显然被@Configuration声明的类也是Spring的组件。
@ComponentScan的其他属性(过滤)
过滤规则有很多,这里简单介绍两个:
includeFilters是扫描的时候只包含哪些,excludeFilters是扫描的时候排除哪些。它们的值都是一个Filer数组,看看Filer数组是什么:
是@Filter注解,看看这个注解的写法:
可以定义排除规则,可以按注解排除,也可以按类排除等等,是类就是类的Class,是注解就是注解的Class:
例如这里排除@Controller注解:
再测试看看,少了@Controllr的组件:
再来测试只包含@Controller的注解,这里要注意的是要加上useDefaultFilters=false,即关闭默认的过滤规则:
再看看@ComponentScan注解:
说明它是支持重复注解的,也就是说可以多个@ComponentScan一起使用,不过这个要jdk1.8以上才支持,在使用的时候要注意的是根据反射获取注解的属性值的时候会有点小变化,具体简单测试下就行了。
@Scope
这个注解放在Spring组件上可以控制该组件是单实例还是多实例,作用域等等,和xml文件中的那个属性是一样的。
要注意的是:Spring IOC容器启动,在多实例下,只有在用到的时候才会去创建,而在单实例下,是IOC容器启动就会去创建。