文章目录
- 一、作用
- 二、注解属性说明
- 三、使用方式
一、作用
主要是从定义的扫描路径中,找出标识了需要装配的类自动装配到Spring的bean容器中。
简单的说就是 @ComponentScan告诉Spring从哪里找到bean
,一旦指定了,Spring就会将指定的包及其下级的包中寻找bean。
在SpringBoot项目中,我们并没有显示的看到该注解,但是仍然能扫描到bean呢?
其实,在创建SpringBoot项目中,默认在启动类上添加了@SpringBootApplication注解,该注解中包含@ComponentScan注解
,因此SpringBoot会自动帮我们扫描启动类所在的包。
二、注解属性说明
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {/*** 对应的包扫描路径 可以是单个路径,也可以是扫描的路径数组* @return*/@AliasFor("basePackages")String[] value() default {};/*** 和value一样是对应的包扫描路径 可以是单个路径,也可以是扫描的路径数组* 如果为空,则以@ComponentScan注解的类所在的包为基本的扫描路径* @return*/@AliasFor("value")String[] basePackages() default {};/*** 指定具体的扫描的类* @return*/Class<?>[] basePackageClasses() default {};/*** 对应的bean名称的生成器 默认的是BeanNameGenerator* @return*/Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;/*** 处理检测到的bean的scope范围*/Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;/*** 是否为检测到的组件生成代理* Indicates whether proxies should be generated for detected components, which may be* necessary when using scopes in a proxy-style fashion.* <p>The default is defer to the default behavior of the component scanner used to* execute the actual scan.* <p>Note that setting this attribute overrides any value set for {@link #scopeResolver}.* @see ClassPathBeanDefinitionScanner#setScopedProxyMode(ScopedProxyMode)*/ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;/*** 控制符合组件检测条件的类文件 默认是包扫描下的 **/*.class* @return*/String resourcePattern() default ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN;/*** 是否对带有@Component @Repository @Service @Controller注解的类开启检测,默认是开启的* @return*/boolean useDefaultFilters() default true;/*** 指定某些定义Filter满足条件的组件 FilterType有5种类型如:* ANNOTATION, 注解类型 默认* ASSIGNABLE_TYPE,指定固定类* ASPECTJ, ASPECTJ类型* REGEX,正则表达式* CUSTOM,自定义类型* @return*/Filter[] includeFilters() default {};/*** 排除某些过来器扫描到的类* @return*/Filter[] excludeFilters() default {};/*** 扫描到的类是都开启懒加载 ,默认是不开启的* @return*/boolean lazyInit() default false;
}
三、使用方式
启动类
:
package com.springboottest;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
public class SpringbootTestApplication {public static void main(String[] args) {SpringApplication.run(SpringbootTestApplication.class, args);}
}
启动类在 com.springboottest
包下,那么Spring默认会自动扫描该包及其子包下的bean。
Student类
(包路径:com.springtest,非启动类所在的包下):
package com.springtest;import lombok.Data;
import org.springframework.stereotype.Component;@Data
@Component
public class Student {private String name;private String nickName;
}
如果想让Student类被Spring扫描到,那么我们可在启动类中增加如下注解:
package com.springboottest;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
@ComponentScan(basePackages = {"com.springtest", "com.springboottest"})
// @ComponentScan(basePackages = {"com"})
public class SpringbootTestApplication {public static void main(String[] args) {SpringApplication.run(SpringbootTestApplication.class, args);}
}
上面的代码我们可以看到,@ComponentScan注解中设置了两个包名("com.springtest", "com.springboottest"),这样设置是为了精确扫描范围,当然我们也可以使用两个包名的共同前缀com
。
注:如果需要扫描的类在不同的包下,最好是精确指定要扫描的包,这样可以减少加载时间。