给容器中注册组件的方式:
包扫描+组件注解(@ ComponentScan等):局限于自己写的类
@Bean:导入的第三方包里面的组件
@Import(value=""):可以快速的给容器导入一个组
1:value:要导入到容器中的组件(例如@Import(one.java),@Import({one.class,two.class})
2:实现ImportSelector接口(myImportSelector.java):返回需要导入的组件的全类名数组:常
3:实现ImportBeanDefinitionRegistrar接口(myImportBeanDefinitionRegistrar.java)
4:使用spring提供的FactoryBean(工厂):也是实现这个接口:myFactoryBean.java
一:包扫描@ ComponentScan:
* value:指定要扫描的包
* excludeFilters;指定按照什么规则要排除的哪些组件;(exclude):排除
举例:
@ComponentScan(value = "com.lh",
excludeFilters = {
@Filter(type
= FilterType.ANNOTATION,classes = {Controller.class,Service.class} )
})
ludeFilters:指定按照什么规则只扫描哪些组件;(include):包括
* 注意:要使用includeFilters,需要把默认的过滤规则禁用:useDefaultFilters=false等同于配置文件中的use-default-filters="false"
@ComponentScan(value = "com.lh",
includeFilters = {
/*
*
@Filter(type=FilterType.ANNOTATION,classes={Configuration.class,Repository.class}),
* @Filter(type =
FilterType.ASSIGNABLE_TYPE,classes= {UserService.class}),
*/
@Filter(type = FilterType.CUSTOM,classes
= {myTypeFilter.class})
},
useDefaultFilters = false
)
```
其中:
* @Filter:过滤器:
* type():按照类型:
* FilterType.ANNOTATION:按照注解类型(比如:Controller.class):常用
* FilterType.ASSIGNABLE_TYPE:按照指定的类型(比如UserService.class):常用
* FilterType.ASPECTJ:按照ASPECTJ表达式:不常用
* FilterType.REGEX:按照正则表达式:不常用
* FilterType.CUSTOM:自定义规则,定义工具类:myTypeFilter.java
myTypeFilter.java工具类:要想自定义规则,首先需要实现“TypeFilter”接口,重写“match“方法,通过它里面的参数“metadataReader”可以读取到当前正在扫描的类的信息,使用你自定义的条件达到自定义规则的目的;例如:
```java
@Override
public boolean
match(MetadataReader metadataReader, MetadataReaderFactory
metadataReaderFactory)
throws
IOException {
//获取到当前正在扫描的类的注解的信息
AnnotationMetadata
annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前正在扫描的类的类信息
ClassMetadata
classMetadata = metadataReader.getClassMetadata();
//获取当前正在扫描的类的资源信息(类的路径)
Resource
resource = metadataReader.getResource();
//获取当前类的名称:
String
className = classMetadata.getClassName();
//System.out.println("当前扫描类的名称"+className);
if(className.contains("ser"))
{
return
true;
}
return false;
}
测试自定义规则注册组件:
@Test
public void myTest3() {
AnnotationConfigApplicationContext
applicationContext=new
AnnotationConfigApplicationContext(myProfileConfig.class);
String[] beanNamesForType =
applicationContext.getBeanNamesForType(DataSource.class);
for
(String beanName : beanNamesForType) {
System.out.println(beanName);
//输出为:dataSourceTest,dataSourceDev,dataSourceProd
}}
原文:https://www.cnblogs.com/JpfBlog66/p/14242512.html