spring註解之@Import 【1】@Import 參數value接收一個Class數組,將你傳入的類以全類名作為id加入IOC容器中 比較簡單,此處不做詳細解釋 【2】ImportSelector ImportSelector強調的是復用性,使用它需要創建一個類實現ImportSe ...
spring註解之@Import
【1】@Import
參數value接收一個Class數組,將你傳入的類以全類名作為id加入IOC容器中
比較簡單,此處不做詳細解釋
【2】ImportSelector
ImportSelector強調的是復用性,使用它需要創建一個類實現ImportSelector介面,實現方法的返回值是字元串數組,也就是需要註入容器中的組件的全類名。id同樣也是全類名。
上代碼:
//自定義邏輯返回需要導入的組件
public class MyImportSelector implements ImportSelector {
// 返回值就是導入到容器中的組件全類名
// AnnotationMetadata:當前標註@Import註解的類的所有註解信息
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[] { "test.spring.ZhangSan", "test.spring.LiSi", "test.spring.WangWu" };
}
}
【3】ImportBeanDefinitionRegistrar
spring官方就是用這種方式,實現了@Component、@Service等註解的動態註入機制。定義一個ImportBeanDefinitionRegistrar的實現類,然後在有@Configuration註解的配置類上使用@Import導入
具體使用:創建一個ImportBeanDefinitionRegistrar的實現類,實現registerBeanDefinitions方法,對組件進行註入。
public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* @param annotationMetadata 當前標註@Import註解的類的所有註解信息
* @param beanDefinitionRegistry BeanDefinition的註冊類
*/
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(Cat.class);
beanDefinitionRegistry.registerBeanDefinition("cat",beanDefinition);
}
}
配置類MyConfig:
@Configuration
@Import(value = {MyBeanDefinitionRegistrar.class})
public class MyConfig {
}
/**測試結果
beanName: org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName: org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName: org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName: org.springframework.context.event.internalEventListenerProcessor
beanName: org.springframework.context.event.internalEventListenerFactory
beanName: myConfig
beanName: cat
*/