天天看點

【Spring注解】@Import注解

[email protected]

常用的導入注解分類:
  1. 注冊自己寫的類service、dao、controller可用包掃描+元件标注注解(@Controller/@Service/@Repository/@Component)
  2. @Bean[導入的第三方包裡面的元件]
  3. @Import[快速給容器中導入一個元件]
    )、@Import(要導入到容器中的元件);容器中就會自動注冊這個元件,id預設是全類名
    )、ImportSelector:傳回需要導入的元件的全類名數組;
    )、ImportBeanDefinitionRegistrar:手動注冊bean到容器中
               

4.1 @Import

建立實體類Animal、Cat、Dog來測試
【Spring注解】@Import注解
配置類 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為全類名
【Spring注解】@Import注解

[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
【Spring注解】@Import注解

[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
【Spring注解】@Import注解