一、Spring中的@Import 註解使用場景
@Import註解在Spring的源碼中使用特別深廣,值得對其使用場景進行研究與整理。
@Import註解通常可以引入如下類型的java類:
- 導入@Configuration註解的配置類;
- 導入ImportSelector的實現類;
- 導入ImportBeanDefinitionRegistrar的實現類;
二、@Configuration註解的配置類
@Import引入@Configuration註解配置的類,對應import的類都會加入並註冊爲spring容器中的bean:
@Import({ 類名.class , 類名.class... })
public class MyConfig{
}
三、導入ImportSelector的實現類
編寫ImportSelector的實現類,實現selectImports()方法,該方法的相關信息如下:
- 參數AnnotationMetadata : AnnotationMetadata表示當前被@Import註解給標註的所有註解信息
- 返回值String[]: 就是我們實際上要導入到容器中的組件全類名
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//return new String[]{"com.tang.Test.MyConfig"};
//或者:
return new String[]{類1.class.getName(), 類2.class.getName()};
//說明:可以返回空數組但是不能返回null,否則會報空指針異常
}
}
四、導入ImportBeanDefinitionRegistrar的實現類
編寫ImportBeanDefinitionRegistrar的實現類,實現registerBeanDefinitions()方法,該方法的相關信息如下:
- 第一個參數:annotationMetadata 和之前的ImportSelector參數一樣都是表示當前被@Import註解給標註的所有註解信息
- 第二個參數:表示用於註冊定義一個bean
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
//指定bean定義信息(包括bean的類型、作用域...)
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestBean.class);
//註冊一個bean指定bean名字(id)
beanDefinitionRegistry.registerBeanDefinition("testBean",rootBeanDefinition);
}
}