1. 程式人生 > 程式設計 >spring註解@Import用法詳解

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
*/

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。