不管是xml还是注解,他们都是表达bean定义的载体,其实质都是为Spring容器提供Bean定义的信息,在表现形式上都是讲xml定义的内容通过类注解进行描述。

Spring容器成功启动的三大要件分别为:bean定义信息,bean实现类,spring本身。
如果采用基于xml的配置,则bean定义信息和bean实现类本身是分离的;而如果采用基于注解的配置文件,则bean定义信息通过在bean实现类上标注注解实现。

@Controller:用于对Controller实现类进行标注
@Repository:用于对DAO实现类精心标注
@Service:用于对Service实现类进行标注

Spring提供了一个context命名空间,他提供了通过扫描类包以应用注解定义Bean的方式。
如果仅希望扫描特定的类而非基包下的所有类,那么可以使用resource-pattern属性过滤出特定的类。
include-filter表示要包含的目标类,而exclude-filter表示要排除的目标类。use-default-filter属性,其默认值为true,表示默认会对标注@Component,@Controller,@Service,@Reposity的Bean进行扫描。

组件注册-@ComponentScan-自动扫描组件&指定扫描规则

以前的xml配置,是需要做包扫描的:

只要是标注了@Controller,@Service,@Repository,@Component的组件,都会被扫描进容器中。

xml中添加的配置信息为:

spring 扫描指定Controller包 spring组件扫描_配置文件

通过注解的方式,自动扫描组件
@ComponentScan(value="com.atguigu") value表示要扫描包com.atguigu,其中,com.atguigu是包名
excludeFilters 表示过滤器,扫描的时候,在该过滤器中的组件将会排出在spring容器外。
excludeFilters ={@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class,Controller.class})}
这句话表示,Service,Controller这两个组件将会排除在spring容器外
type表示过滤的类型,这里用的是FilterType.ANNOTATION,表示按照注解排除

下面我们看运行结果:

没排除前(也就是没加过滤器,以及use-default-filter=true),spring容器中的组件为:

spring 扫描指定Controller包 spring组件扫描_spring_02

增加过滤器后excludeFilters ={@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class,Controller.class})},spring容器中的组件为:

spring 扫描指定Controller包 spring组件扫描_xml_03

从上面的比对结果可以看出,excludeFilters 将Service,Controller都过滤在spring容器外了。

excludeFilters 表示扫描的时候,按照一定规则,排除哪些组件
includeFilters 表示扫描的时候,只需要包含哪些组件

只有禁用默认规则(默认规则表示扫描所有组件),includeFilters才会生效。useDefaultFilters = false

增加includeFilters后,输出为:

@ComponentScan(value = "com.atguigu", includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = { Controller.class})},useDefaultFilters = false)

增加过滤器includeFilters 后,输出为:

spring 扫描指定Controller包 spring组件扫描_xml_04