享学笔记:Spring之ComponentScan包扫描注解使用
1.ComponentScan是什么@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中。@Controller,@Service,@Repository注解,他们中有一个共同的注解@Component,@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Componen
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
更多推荐
所有评论(0)