1.ComponentScan是什么

@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中。

@Controller,@Service,@Repository注解,他们中有一个共同的注解@Component,@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。

2.源码

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    /**
     * 对应的包扫描路径 可以是单个路径,也可以是扫描的路径数组
     * @return
     */
    @AliasFor("basePackages")
    String[] value() default {};
    /**
     * 和value一样是对应的包扫描路径 可以是单个路径,也可以是扫描的路径数组
     * @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;
}

3.测试

创建3个类

@Controller
public class PersonController {
}

 

@Service
public class PersonService {
}

 

@Repository
public class PersonDao {
}

 

和一个配置类

@Configuration
public class BeanConfig {

}

 

测试类

public class BeanTest {
    public static void main(String[] args) {
        //加载容器中
        AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(BeanConfig.class);
        String[] definitionNames = applicationContext2.getBeanDefinitionNames();
        for (String name : definitionNames) {
            System.out.println(name);
        }
    }
}

包结构:

 

开始测试

配置类中添加注解

@ComponentScan 默认扫描所有包

@Configuration
@ComponentScan
public class BeanConfig {
}

输出:

beanConfig

personDao

personService

personController

 

 

指定包扫描

@Configuration
@ComponentScan(value = "com.jxhx.spring.bean.controller")
public class BeanConfig {
}

 

输出:

beanConfig

personController

 

 

basePackageClasses 扫描指定类

创建一个新类cc

@Configuration
@ComponentScan(value = "com.jxhx.spring.bean",useDefaultFilters = true,basePackageClasses = cc.class)
public class BeanConfig {
}

 

输出:

beanConfig

personDao

personService

personController

cc

 

扫描指定组件:

includeFilters

FilterType有5种类型如:

  • ANNOTATION, 注解类型 默认
  • ASSIGNABLE_TYPE,指定固定类
  • ASPECTJ, ASPECTJ类型
  • REGEX,正则表达式
  • CUSTOM,自定义类型

 

 

@Configuration
@ComponentScan(value = "com.jxhx.spring.bean",useDefaultFilters = false,includeFilters = {
        //扫描指定Controller注解的类
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
})
public class BeanConfig {
}

输出:

beanConfig

personController

 

 

指定不扫描组件

excludeFilters

@Configuration
@ComponentScan(value = "com.jxhx.spring.bean",useDefaultFilters = true,excludeFilters = {
        //扫描指定Controller注解的类
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
})
public class BeanConfig {
}

 

输出:

beanConfig

personDao

personService

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐