Skip to content

一、ImportSelector 接口类有什么作用 ?

  • 作用:帮助我们自定义添加需要注入的多个对象到Spring IoC 容器中。

二、ImportSelector 实例

1. 创建一个 ImportSelectorOS 实现类, 实现 ImportSelector 接口类。

java
package org.example.spring5.config.imports;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @author: Calvin <br>
 * @date: 2020/11/26 11:32 <br>
 * @since: 1.0 <br>
 * @description: ImportSelectorOS <br>
 */
public class ImportSelectorOS implements ImportSelector {

    /**
     * 选择导入的Bean对象列表
     *
     * @param annotationMetadata 注解信息
     * @return 注入 Bean对象列表,在String数组中
     */
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        String win7 = "org.example.spring5.domain.Win7";
        String win1O = "org.example.spring5.domain.Win10";
        return new String[]{win7, win1O};
    }
}

2. 创建一个 @EnableOS 注解,使用@Import 注入 ImportSelectorOS.class 编译类。

java
package org.example.spring5.config.annotations;

import org.example.spring5.config.imports.ImportSelectorOS;
import org.springframework.context.annotation.Import;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author: Calvin <br>
 * @date: 2020/11/26 10:50 <br>
 * @since: 1.0 <br>
 * @description: EnableOS <br>
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(value = ImportSelectorOS.class)
public @interface EnableOS {
}

3. 在 SpringConfiguration 配置类中,引入 @EnableOS

  • 引入 @EnableOS 相当于在 @Import(value=Win10.class, Win7.class) 将 Win10 Bean 对象和 Win7 Bean 对象注入到 Spring IoC 容器中。
java
package org.example.spring5.config;

import org.example.spring5.config.annotations.EnableOS;
import org.example.spring5.domain.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * @author: Calvin <br>
 * @date: 2020/11/25 14:18 <br>
 * @since: 1.0 <br>
 * @description: SpringConfiguration <br>
 */
@Configuration 
@EnableOS
@ComponentScan(value = "org.example.spring5")
public class SpringConfiguration {
}

4. 启动程序

java
package org.example.spring5;

import org.example.spring5.config.SpringConfiguration;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;

/**
 * @author: Calvin <br>
 * @date: 2020/11/25 14:27 <br>
 * @since: 1.0 <br>
 * @description: SpringApplication <br>
 */
public class SpringApplication {

    private static AnnotationConfigApplicationContext annotationConfigApplicationContext;

    public static void main(String[] args) {
        annotationConfigApplicationContext  = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        System.out.println("Bean 对象已装配完毕...");
    }
}

5. 输出结果

log
Win7 对象将被注入到容器中...
Win10 对象将被注入到容器中...
Bean 对象已装配完毕...