今天主要從如下幾方面來介紹一下@Import註解spring
@Import註解是什麼數組
@Import的三種使用方式app
1,@Import註解是什麼ide
經過導入的方式實現把實例加入springIOC容器中測試
2,@Import的三種使用方式spa
經過查看@Import源碼能夠發現@Import註解只能註解在類上,以及惟一的參數value上能夠配置3種類型的值Configuration,ImportSelector,ImportBeanDefinitionRegistrar,源碼以下:code
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}
接下來就分別來看看三種方式具體使用:component
a,基於Configuration也就是直接填對應的class數組orm
在bean目錄下新增兩個類Square和Circular以下:ci
/**
* 定義一個圓形
*
* @author zhangqh
* @date 2018年5月1日
*/
public class Circular {
}
/**
* 定義一個正方形
*
* @author zhangqh
* @date 2018年5月1日
*/
public class Square {
}
MainConfig註解配置中增長@Import註解以下:
@Import({Square.class,Circular.class})
@Configuration
public class MainConfig
測試打印以下:
AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
String[] beanNames = applicationContext2.getBeanDefinitionNames();
for(int i=0;i<beanNames.length;i++){
System.out.println("bean名稱爲==="+beanNames[i]);
}
運行結果:
bean名稱爲===mainConfig
bean名稱爲===com.zhang.bean.Square
bean名稱爲===com.zhang.bean.Circular
對應的import的bean都已經加入到spring容器中了
b,基於自定義ImportSelector的使用
定義一個MyImportSelector以下:
/**
* 定義一個我本身的ImportSelector
*
* @author zhangqh
* @date 2018年5月1日
*/
public class MyImportSelector implements ImportSelector{
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.zhang.bean.Triangle"};
}
}
MainConfig註解配置修改以下:
@Import({Square.class,Circular.class,MyImportSelector.class})
測試結果以下:
bean名稱爲===mainConfig
bean名稱爲===com.zhang.bean.Square
bean名稱爲===com.zhang.bean.Circular
bean名稱爲===com.zhang.bean.Triangle
三角形 實例一樣加入到spring容器中了
c,基於ImportBeanDefinitionRegistrar的使用
新建一個ImportBeanDefinitionRegistrar以下:
/**
* 定義一個自定的ImportBeanDefinitionRegistrar
*
* @author zhangqh
* @date 2018年5月1日
*/
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
// new一個RootBeanDefinition
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Rectangle.class);
// 註冊一個名字叫rectangle的bean
registry.registerBeanDefinition("rectangle", rootBeanDefinition);
}
}
修改MainConfig註解配置以下:
@Import({Square.class,Circular.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
運行結果以下:
bean名稱爲===mainConfig
bean名稱爲===com.zhang.bean.Square
bean名稱爲===com.zhang.bean.Circular
bean名稱爲===com.zhang.bean.Triangle
bean名稱爲===rectangle
rectangle打印出來了說明咱們經過ImportBeanDefinitionRegistrar註冊的實例也成功加入到了spring容器了
以上是今天文章的全部內容,歡迎你們吐槽
更多優質文章請關注如下公衆號查閱: