【spring】@ComponentScan注解学习

@ComponentScan介绍

打开@ComponentScan源码。

@ComponentScan注解是从Spring的3.1版本开始提供的。

@ComponentScan注解最核心的功能就是Spring IOC容器在刷新的时候会扫描对应包下标注了@Component注解、@Configuration注解、@Repository注解、@Service注解和@Controller等等注解的类,生成扫描到的类的Bean定义信息,整体流程与注册ConfigurationClassPostProcessor类的Bean定义信息的流程基本一致,最终都会将其保存到BeanFactory中的beanDefinitionMap中。

简化源码:


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {

	@AliasFor("basePackages")
	String[] value() default {};

	@AliasFor("value")
	String[] basePackages() default {};

	Class<?>[] basePackageClasses() default {};

	Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

	Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;

	ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;

	String resourcePattern() default ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN;

	boolean useDefaultFilters() default true;

	Filter[] includeFilters() default {};

	Filter[] excludeFilters() default {};

	boolean lazyInit() default false;

	@Retention(RetentionPolicy.RUNTIME)
	@Target({})
	@interface Filter {

		FilterType type() default FilterType.ANNOTATION;

		@AliasFor("classes")
		Class<?>[] value() default {};

		@AliasFor("value")
		Class<?>[] classes() default {};
	
		String[] pattern() default {};
	}
}

属性介绍

@ComponentScan属性介绍
  • value:作用同basePackages属性,String[]数组类型,指定要扫描的包名。如果指定了要扫描的包名,则Spring会扫描指定的包及其子包下的所有类。
  • basePackages:作用同value属性,String[]数组类型,指定要扫描的包名。如果指定了要扫描的包名,则Spring会扫描指定的包及其子包下的所有类。
  • basePackageClasses:Class<?>[]数组类型,指定要扫描的类的Class对象。
  • nameGenerator:Class<? extends BeanNameGenerator>类型,指定扫描类时,向IOC注入Bean对象时的命名规则。
  • scopeResolver:Class<? extends ScopeMetadataResolver>类型,扫描类时,用于处理并转换符合条件的Bean的作用范围。
  • scopedProxy:ScopedProxyMode类型,指定生成Bean对象时的代理方式,默认的代理方法是DEFAULT,也就是不使用代理。关于ScopedProxyMode的更多详细的内容,参见2.1.3节。
  • resourcePattern:String类型,用于指定扫描的文件类型,默认是扫描指定包下的*/*.class
  • useDefaultFilters:boolean类型,是否自动检测@Component @Repository @Service @Controller注解,默认是true。
  • includeFilters:Filter[]数组类型,自定义组件扫描过滤规则,符合过滤规则的类的Bean定义信息会被注册到IOC容器中。includeFilters表示只包含对应的规则,当使用includeFilters()来指定只包含哪些注解标注的类时,需要禁用默认的过滤规则,也就是需要将useDefaultFilters属性设置为false。并且,除了符合过滤规则的类外,Spring内置的如下名称的类的Bean定义信息注册到IOC容器时不受过滤规则限制,如下所示。
  • excludeFilters:Filter[]数组类型,自定义组件扫描过滤规则,excludeFilters表示排除使用对应的规则,符合过滤规则的类的Bean定义信息不会被注册到IOC容器中。
  • lazyInit:boolean类型,从Spring4.1版本开始提供,表示Spring扫描组件时是否采用懒加载 ,默认false,表示不开启懒加载。
@Filter注解属性介绍
  • type:FilterType类型,表示过滤规则的类型。关于FilterType的更多详细的内容,参见2.1.4节。
  • value:Class<?>[]数组类型,过滤符合规则的类,作用同classes属性。
  • classes:Class<?>[]数组类型,过滤符合规则的类,作用同value属性。
  • pattern:如果FilterType取值为ASPECTJ,则此属性表示ASPECTJ表达式。
ScopedProxyMode枚举类

ScopedProxyMode枚举类表示Spring指定生成Bean对象时的代理方式。

public enum ScopedProxyMode {
	DEFAULT,
	NO,
	INTERFACES,
	TARGET_CLASS
}
  • DEFAULT:默认的代理方式,也就是不使用代理,除非在component-scan级别使用了不同的配置。
  • NO:不使用代理。
  • INTERFACES:基于JDK动态代理实现接口代理对象。
  • TARGET_CLASS:基于CGLib动态代理创建类代理对象。
 FilterType枚举类源码

public enum FilterType {
	ANNOTATION,
	ASSIGNABLE_TYPE,
	ASPECTJ,
	REGEX,
	CUSTOM
}
 
  • ANNOTATION:按照注解进行过滤。
  • ASSIGNABLE_TYPE:按照给定的类型进行过滤。
  • ASPECTJ:按照ASPECTJ表达式进行过滤。
  • REGEX:按照正则表达式进行过滤。
  • CUSTOM:按照自定义规则进行过滤,使用自定义过滤规则时,自定义的过滤器需要实现org.springframework.core.type.filter.TypeFilter接口。




相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-13 05:32:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-13 05:32:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-13 05:32:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-13 05:32:04       20 阅读

热门阅读

  1. 前端学习|HTML基础笔记

    2024-03-13 05:32:04       20 阅读
  2. 小程序连接蓝牙

    2024-03-13 05:32:04       21 阅读
  3. el-form v-for循环列表的表单如何校验

    2024-03-13 05:32:04       22 阅读
  4. 大数据开发(Hive面试真题-卷一)

    2024-03-13 05:32:04       21 阅读
  5. 每天一个数据分析题(二百零一)

    2024-03-13 05:32:04       20 阅读
  6. MongoDB

    MongoDB

    2024-03-13 05:32:04      24 阅读
  7. GITLAB - CI 常用语法小记

    2024-03-13 05:32:04       24 阅读
  8. python中的四大内置容器

    2024-03-13 05:32:04       22 阅读
  9. MongoDB聚合运算符:$documentNumber

    2024-03-13 05:32:04       21 阅读
  10. Apache Tomcat环境搭建

    2024-03-13 05:32:04       20 阅读