Spring 通过注解定义Bean以及自动扫描注解定义的bean ComponentScan 自动扫描组件&指定扫描规则
本文内容纲要: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 自动扫描组件&指定扫描规则
原文链接:https://www.cnblogs.com/ch-10/p/9738739.html
以上是 Spring 通过注解定义Bean以及自动扫描注解定义的bean ComponentScan 自动扫描组件&指定扫描规则 的全部内容, 来源链接: utcz.com/z/362346.html