1. 程式人生 > 實用技巧 >Spring註解之@Import

Spring註解之@Import

@Import註解是用於給Spring容器匯入元件,其主要的使用方式有下列三種

一、@Import

  1、@Import註解的詳細資訊如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
  // @Import註解的取值是一個Class型別的陣列,可以同時填寫多個類的位元組碼檔案 
    Class<?>[] value();
}

  2、@Import註解的使用位置

public enum ElementType {
    // 使用在類上、介面上(包括註解型別)、或者是列舉宣告上
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

  3、@Import註解語法格式

    @Import({類1.class,類2.class,類3.class......}) 

  4、測試@Import註解

    一、準備幾個測試類,PineApple,Plum、WaterMelon

    二、Spring的配置類

@Configuration
// 使用@Import將下面三個元件匯入到Spring中,交由Spring容器進行管理
@Import({PineApple.class,Plum.class,WaterMelon.class})
public class SpringConfiguration {
}

    三、測試類

public class SpringDemo {
    
    @Test
    public void springTest01() {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        // 獲取並輸出所有Bean的名稱
        String[] beanDefinitionNames2 = context.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames2) {
            System.out.println(beanDefinitionName);
        }
    }
}

    四、測試結果

// Spring容器自身元件
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
// Spring配置類
springConfiguration
// 自定義元件
com.spring01.bean.PineApple
com.spring01.bean.Plum
com.spring01.bean.WaterMelon

  

二、實現ImportSelector介面&&@Import註解

  1、自定義類(MyImportSelector)實現ImportSelector介面

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // 定義一個字串陣列,裡面定義你要注入到Spring容器中的類,(包類路徑)
        String[] strArr = {"com.spring01.bean.WaterMelon","com.spring01.bean.PineApple"};

        return strArr;
    }
}

  2、配置類

@Configuration
// 匯入自定義類MyImportSelector
@Import(MyImportSelector.class)
public class SpringConfiguration {
}

  3、測試類

public class SpringDemo {

    @Test
    public void springTest01() {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        // 獲取並輸出所有Bean的名稱
        String[] beanDefinitionNames2 = context.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames2) {
            System.out.println(beanDefinitionName);
        }
    }
}

  4、測試結果

// Spring容器自身元件
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
// Spring配置類
springConfiguration
// 自定義要匯入的元件
com.spring01.bean.WaterMelon
com.spring01.bean.PineApple

  

三、實現ImportBeanDefinitonRegistrar介面&&@Import註解

  1、自定義類MyImportBeanDefinitionRegistrar實現ImportBeanDefinitionRegistrar介面,並且手動實現registerBeanDefinitions方法

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
     // 指定Bean的資訊 RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Plum.class);
// 註冊bean時指定bean對應的id registry.registerBeanDefinition("plum",rootBeanDefinition); } }

  2、配置類

@Configuration
@Import({MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class SpringConfiguration {
}

  3、測試類

@Test
public void springTest01() {
    ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class);
    // 獲取並輸出所有Bean的名稱
    String[] beanDefinitionNames2 = context.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames2) {
    System.out.println(beanDefinitionName); } }

  4、測試結果

// Spring容器自身元件
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
// Spring配置類
springConfiguration
// 使用實現ImportSelector介面和@Import註解實現注入元件
com.spring01.bean.PineApple
com.spring01.bean.WaterMelon
// 使用實現ImportBeanDefinitionRegistrar介面和@Import註解實現注入元件
plum