一、Spring注解之@ComponentScan
Spring注解之@ComponentScan
【1】@ComponentScan注解是什么
@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中
【2】@ComponentScan注解的详细使用
1、创建一个配置类,在配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的类
package com.zl.springbase.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class MyConfig {
}
我的类结构如下:类MyDao上面添加了@Repository注解

测试程序:
public class TestComponentScan {
@Test
public void test1(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
String[] names = context.getBeanDefinitionNames();
for (String name : names) {
System.out.println("beanName"+name);
}
}
}
/**
beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: myConfig
beanName: myDao
*/
2、指定要扫描的包(使用@ComponentScan 的 valule 属性来配置),创建一个controller 包,并在该包下新建一个 MyController 类并添加@Controller注解。
@Configuration
@ComponentScan(value = {"com.zl.springBase.controller"})
public class MyConfig {
}
/**测试结果
beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: myConfig
beanName: myController
*/
3、excludeFilters 和 includeFilters 的使用
- excludeFilters
①使用 excludeFilters 来按照注解类型排除某些包的扫描
@Configuration
@ComponentScan(value = {"com.zl.springBase"},excludeFilters = {
@Filter(type = FilterType.ANNOTATION,value = {Controller.class})
})
public class MyConfig {
}
/**测试结果
beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: myConfig
beanName: myDao
*/
excludeFilters 的参数是一个 Filter[] 数组,然后指定 FilterType 的类型为 ANNOTATION,也就是通过注解来过滤,最后的 value 则是Controller 注解类。配置之后,在 spring 扫描的时候,就会跳过 com.zl.springBase包下,所有被 @Controller 注解标注的类。
②使用 excludeFilters 来按照指定类型排除某些包的扫描
@Configuration
@ComponentScan(value = {"com.zl.springBase"},excludeFilters = {
@Filter(type = FilterType.ASSIGNABLE_TYPE,value = {MyDao.class})
})
public class MyConfig {
}
/**测试结果
beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: myConfig
beanName: myController
*/
FilterType 的类型为 ASSIGNABLE_TYPE,就是通过指定类型来过滤,value指定为MyDao,则会过滤掉MyDao这个类。
③使用 excludeFilters 来按照自定义类型排除某些包的扫描
首先创建一个实现 TypeFilter 接口的 CustomTypeFilter 类,并实现其 match 方法。
这里简单对扫描到的类名进行判断,如果类名包含”Co“的就符合条件,也就会注入到容器中。
public class CustomTypeFilter implements TypeFilter {
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取到当前扫描到的类的注解信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取到当前扫描到的类的信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//获取到当前扫描到的类的资源
Resource resource = metadataReader.getResource();
if (classMetadata.getClassName().contains("Co")) {
return true;
}
return false;
}
}
MyConfig:
@Configuration
@ComponentScan(value = {"com.zl.springBase"},excludeFilters = {
@Filter(type = FilterType.CUSTOM,value = {CustomTypeFilter.class})
})
public class MyConfig {
}
/**测试结果
beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: myConfig
beanName: myDao
*/
可以看到MyController已经被过滤掉了,myCofig之所以没有被过滤掉是因为它本身是一个配置类,@Configuration注解类里面包含了@Component注解,所以IOC容器启动后MyConfig会被自动加入容器当中。
- includeFilters
使用 includeFilters 来按照规则只包含某些包的扫描
在创建一个 service 的包,并创建一个 MyService 类,再加上一个 @Service 注解
修改MyConfig类:
@Configuration
@ComponentScan(value = {"com.zl.springBase"},includeFilters = {
@Filter(type = FilterType.ANNOTATION,value = {Controller.class})
})
public class MyConfig {
}
/**测试结果
beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: myConfig
beanName: myDao
beanName: myController
beanName: myService
*/
配置里面,应该是只包含 @Controller 注解的类才会被注册到容器中,为什么 @Service,@Repository 注解的类也被注册了呢?这里涉及到 @ComponentScan 的一个 useDefaultFilters 属性的用法,该属性默认值为 true,也就是说 spring 默认会自动发现被 @Component、@Repository、@Service 和 @Controller 标注的类,并注册进容器中。要达到只包含某些包的扫描效果,就必须将这个默认行为给禁用掉(在 @ComponentScan 中将 useDefaultFilters 设为 false 即可)。
一、Spring注解之@ComponentScan的更多相关文章
- 深入理解spring注解之@ComponentScan注解
今天主要从以下几个方面来介绍一下@ComponentScan注解: @ComponentScan注解是什么 @ComponentScan注解的详细使用 1,@ComponentScan注解是什么 其实 ...
- Spring 注解<context:annotation-config> 和 <context:component-scan>的作用与区别
<context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过packagesanning的方式)上面的注解 ...
- spring注解开发:ComponentScan组件扫描
在使用xml方式配置时,我们只需要在xml中配置如下代码: <context:component-scan base-package="包名"></context ...
- spring注解注入:<context:component-scan>以及其中的context:include-filter>和 <context:exclude-filter>的是干什么的?
转自:https://www.cnblogs.com/vanl/p/5733655.html spring注解注入:<context:component-scan>使用说明 sprin ...
- 【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则
写在前面 Spring的强大之处不仅仅是提供了IOC容器,能够通过过滤规则指定排除和只包含哪些组件,它还能够通过自定义TypeFilter来指定过滤规则.如果Spring内置的过滤规则不能够满足我们的 ...
- spring注解说明之Spring2.5 注解介绍(3.0通用)
spring注解说明之Spring2.5 注解介绍(3.0通用) 注册注解处理器 方式一:bean <bean class="org.springframework.beans.fac ...
- 使用Spring注解来简化ssh框架的代码编写
目的:主要是通过使用Spring注解的方式来简化ssh框架的代码编写. 首先:我们浏览一下原始的applicationContext.xml文件中的部分配置. <bean id="m ...
- spring注解scheduled实现定时任务
只想说,spring注解scheduled实现定时任务使用真的非常简单. 一.配置spring.xml文件 1.在beans加入xmlns:task="http://www.springfr ...
- [转]Spring 注解总结
原文地址:http://blog.csdn.net/wangshfa/article/details/9712379 一 注解优点?注解解决了什么问题,为什么要使用注解? 二 注解的来龙去脉(历史) ...
随机推荐
- 使用XShell工具 linux 常用命令
- 屏幕输入转换为int//方法大注释
可以使用两种方法: using System; namespace 方法测试 { class Program { static void Main(string[] args) { Console.W ...
- 运行时报:尝试加载 Oracle 客户端库时引发 BadImageFormatException,如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题
运行环境为: Windows Server2012 Oracle11g 32位数据库+客户端 IIS发布后提示错误信息: “尝试加载 Oracle 客户端库时引发 BadImageFormatExc ...
- Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计
Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计 二者服务的对象不一样 目的也是不一样的 商品分类是为商品服务的 用来管理商品 商品类型是为扩展属性服务的 用来管理属性 举例:[转] ...
- 怎样深入学习php,成为php高手!?
本文章开头我想问一句话:PHP是做什么的? 因为这是面试中会问到的一个问题,虽然它看起来很简单,回答做网站的,也就是个简单建站的水平.回答做网站后端开发的,对PHP有了一定的认识,回答做后端处理的,有 ...
- ES6复制拷贝数组,对象,json数组
扩展运算符的应用spread打散数组[...] (1)复制数组 数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组. const a1 = [1, 2]; ...
- Vue.js 源码分析(六) 基础篇 计算属性 computed 属性详解
模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护,比如: <div id="example">{{ messag ...
- 使QScrollArea的背景透明,并且不影响子控件
使QScrollArea的背景透明,乍看很easy,其实却是一个目前百度上百不出来的问题; 最容易想到的,用qss: scrollArea->setStyleSheet("backgr ...
- IntelliJ IDEA UML插件
在IntelliJ IDEA Ultimate 版本中自带了一个UML插件:UMLSupport 查看了Community版本和AndroidStudio 发现没有这个插件. 要使用这个插件导出需要的 ...
- python async
理解 python 的 async:1. 协程后面的技术也是 IO 多路复用, Nginx 和 nodejs 都充分利用了这种机制. 2. Flask 线程中为什么不能直接使用标准库 asyncio ...