[email protected]
常用的導入注解分類:
- 注冊自己寫的類service、dao、controller可用包掃描+元件标注注解(@Controller/@Service/@Repository/@Component)
- @Bean[導入的第三方包裡面的元件]
- @Import[快速給容器中導入一個元件]
)、@Import(要導入到容器中的元件);容器中就會自動注冊這個元件,id預設是全類名 )、ImportSelector:傳回需要導入的元件的全類名數組; )、ImportBeanDefinitionRegistrar:手動注冊bean到容器中
4.1 @Import
建立實體類Animal、Cat、Dog來測試
配置類 ImportConfig
/**
* @author GaoYuzhe
* @date 2018/3/13.
*/
//注入Animal對象
@Import(Animal.class)
@Configuration
public class ImportConfig {
}
測試類
/**
* @author GaoYuzhe
* @date 2018/3/13.
*/
public class ImportConfigTest {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ImportConfig.class);
/**
* 周遊比對的元件名稱
* @param annotationConfigApplicationContext 注解上下文
*/
private void printClassName(AnnotationConfigApplicationContext annotationConfigApplicationContext){
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for (int i = ; i < beanDefinitionNames.length; i++) {
System.out.println("比對的類"+beanDefinitionNames[i]);
}
}
@Test
public void testImport(){
printClassName(annotationConfigApplicationContext);
}
}
運作結果:可用看到容器中注冊了Animal對象,id為全類名
[email protected]
自定義導入選擇器,需要實作ImportSelector接口,重寫selectImports(AnnotationMetadata importingClassMetadata)方法傳回一個全類名的數組,注意不能傳回null,不然會報NullPointException
/**
* 自定義導入選擇器
* @author GaoYuzhe
* @date 2018/3/13.
*/
public class MyImportSelecttor implements ImportSelector{
/**
*
* @param importingClassMetadata 加@Import注解的類,所有注解資訊
* @return
*/
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//目前類的所有注解
Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes();
System.out.println("目前配置類的注解資訊:"+annotationTypes);
//注意不能傳回null,不然會報NullPointException
System.out.println("注冊了com.gaoyuzhe.pojo.Cat");
return new String[]{"com.gaoyuzhe.pojo.Cat"};
}
配置類注解
@Import({Animal.class, MyImportSelecttor.class})
運作結果,測試方法同4.1
[email protected]
MyImportBeanDefinitionRegistrar 自定義ImportBeanDefinitionRegistrar
實作ImportBeanDefinitionRegistrar接口
**
* @author GaoYuzhe
* @date //
*/
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
/**
* 注冊bean
* @param importingClassMetadata 目前類的資訊
* @param registry Bean注冊器
*/
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
/**
* BeanDefinition可以設定元件的多個資訊
* 例如:
* setBeanClassName 設定bean的全類名
* setScope 設定bean的作用域
*/
BeanDefinition beanDefinition =new RootBeanDefinition();
beanDefinition.setBeanClassName("com.gaoyuzhe.pojo.Dog");
beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE);
//判斷容器中是否注冊Cat對象,如果有則注冊Dog
if(registry.containsBeanDefinition("com.gaoyuzhe.pojo.Cat")){
//beanName為在容器中的id
registry.registerBeanDefinition("Dog",beanDefinition);
}
}
}
配置類注解
@Import({Animal.class, MyImportSelecttor.class, MyImportBeanDefinitionRegistrar.class})
運作結果,測試方法同4.1