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();
    }
}
相关推荐
再睡亿分钟!16 小时前
Spring MVC 的常用注解
java·开发语言·spring boot·spring
qq_1955516916 小时前
代码随想录70期day7
java·开发语言
Sam-August17 小时前
【分布式架构实战】Spring Cloud 与 Dubbo 深度对比:从架构到实战,谁才是微服务的王者?
java·spring cloud·dubbo
麦兜*17 小时前
MongoDB 常见错误解决方案:从连接失败到主从同步问题
java·数据库·spring boot·redis·mongodb·容器
ytadpole17 小时前
揭秘设计模式:命令模式-告别混乱,打造优雅可扩展的代码
java·设计模式
用户37215742613518 小时前
Java 教程:轻松实现 Excel 与 CSV 互转 (含批量转换)
java
叫我阿柒啊18 小时前
Java全栈开发实战:从基础到微服务的深度解析
java·微服务·kafka·vue3·springboot·jwt·前端开发
凯尔萨厮18 小时前
Java学习笔记三(封装)
java·笔记·学习
霸道流氓气质18 小时前
Java开发中常用CollectionUtils方式,以及Spring中CollectionUtils常用方法示例
java·spring
失散1318 小时前
分布式专题——5 大厂Redis高并发缓存架构实战与性能优化
java·redis·分布式·缓存·架构