Spring 通过注解定义Bean以及自动扫描注解定义的bean ComponentScan 自动扫描组件&指定扫描规则

Posted ChenHui_GXNU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 通过注解定义Bean以及自动扫描注解定义的bean ComponentScan 自动扫描组件&指定扫描规则相关的知识,希望对你有一定的参考价值。

不管是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中添加的配置信息为:

通过注解的方式,自动扫描组件
@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容器中的组件为:

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

从上面的比对结果可以看出,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 通过注解定义Bean以及自动扫描注解定义的bean ComponentScan 自动扫描组件&指定扫描规则的主要内容,如果未能解决你的问题,请参考以下文章

Spring整理系列(11)——@Configuration注解@Bean注解以及配置自动扫描bean作用域

Spring 中的一些注解

spring利用注解来注册bean到容器

面试题@Component和@Bean的区别

注解bean的用途

Spring--通过注解来配置bean