Spring @Import

@Import是Spring框架提供的注解org.springframework.context.annotation.Import,可以通过条件配置,选择性的注入哪些Bean到Spring IOC容器中;

一 @Import注Bean到Spring容器

直接使用@Import注解将Bean对象注入到容器

java 复制代码
public class OrderChoice {
    public void printOrderMsg() {
        System.out.println("One订单信息是: order001");
    }
}

@Configuration
@Import({OrderChoice.class})
public class CommonConfig {

}


@SpringBootTest
@RunWith(SpringRunner.class)
public class TestOne {

    @Autowired
    private OrderChoice orderChoice;

    @Test
    public void testImportOne() {
        orderChoice.printOrderMsg();
    }
}

二 @Import和ImportSelector接口

使用@Import注解和ImportSelector接口静态地导入类

java 复制代码
public class OrderChoice {
    public void printOrderMsg() {
        System.out.println("One订单信息是: order001");
    }
}

public class OrderChoiceTwo {
    public void printOrderMsg() {
        System.out.println("Two订单信息是: order002");
    }
}

public class OrderImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{
                "com.hot.mango.service.OrderChoice",
                "com.hot.mango.service.OrderChoiceTwo"};
    }
}

@Configuration
@Import(OrderImportSelector.class)
public class CommonConfig {

}


@SpringBootTest
@RunWith(SpringRunner.class)
public class TestOne {

    @Autowired
    private OrderChoice orderChoice;

    @Autowired
    private OrderChoiceTwo orderChoiceTwo;

    @Test
    public void testImportTwo() {
        orderChoice.printOrderMsg();
        orderChoiceTwo.printOrderMsg();
    }
}

使用@Import注解和ImportSelector接口选择性地导入类

创建一个Order接口和两个实现类StudentOrder和TeacherOrder,有选择性的导入其中一个实现类

java 复制代码
public interface Order {
    void printOrderMsg();
}

public class StudentOrder implements Order{
    @Override
    public void printOrderMsg() {
        System.out.println("学生的订单信息...");
    }
}

public class TeacherOrder implements Order{
    @Override
    public void printOrderMsg() {
        System.out.println("老师的订单信息...");
    }
}

创建ImportSelector接口的实现类,重写selectImports方法选择需要注入容器的Bean对象的全类名

java 复制代码
public class OrderTwoImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        Map<String, Object> map = 
                annotationMetadata.getAnnotationAttributes(EnableOrder.class.getName());
        EnumOrder enumValue = (EnumOrder) map.get("value");
        switch (enumValue) {
            case STUDENT:
                return new String[] {"com.hot.mango.domain.StudentOrder"};
            case TEACHER:
                return new String[] {"com.hot.mango.domain.TeacherOrder"};
            default:
                return null;
        }
    }
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(OrderTwoImportSelector.class)
public @interface EnableOrder {
    EnumOrder value() default EnumOrder.STUDENT;
}

public enum EnumOrder {
    STUDENT, TEACHER;
}

将@Import注解和其value属性值ImportSelector接口的实现类,添加在EnableOrder注解上,通过EnableOrder注解的value属性值可以选择性的注入Bean对象到容器

java 复制代码
@Configuration
@EnableOrder(value = EnumOrder.TEACHER)
public class CommonConfig {

}

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestOne {

    @Autowired
    private Order order;

    @Test
    public void testImportThree() {
        order.printOrderMsg();
    }
}

三 @Import和ImportBeanDefinitionRegistrar接口

java 复制代码
public class OrderRegistrar {
    public void printOrderMsg() {
        System.out.println("order msg print successfully");
    }
}

public class OrderBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata metadata,
                                        BeanDefinitionRegistry registry) {
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
        rootBeanDefinition.setBeanClass(OrderRegistrar.class);
        registry.registerBeanDefinition("orderRegistrar", rootBeanDefinition);
    }
}

@Configuration
@Import(OrderBeanDefinitionRegistrar.class)
public class CommonConfig {

}

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestOne {

    @Autowired
    private OrderRegistrar orderRegistrar;

    @Test
    public void test() {
        orderRegistrar.printOrderMsg();
    }
}
相关推荐
FQNmxDG4S42 分钟前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全2 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje2 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv72 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫2 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287922 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本2 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211233 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯5 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户60648767188965 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java