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();
    }
}
相关推荐
通域8 分钟前
解决启动IDEA后CPU 及内存占用过高配置调整
java·ide·intellij-idea
一袋米扛几楼9825 分钟前
【软件安全】C语言特性 (C Language Characteristics)
java·c语言·安全
m0_748248021 小时前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
java·开发语言·c++·算法
aloha_7891 小时前
测试开发工程师面经准备(sxf)
java·python·leetcode·压力测试
我命由我123452 小时前
Java 并发编程 - Delay(Delayed 概述、Delayed 实现、Delayed 使用、Delay 缓存实现、Delayed 延迟获取数据实现)
java·开发语言·后端·缓存·java-ee·intellij-idea·intellij idea
北城以北88882 小时前
SSM--MyBatis框架之缓存
java·缓存·intellij-idea·mybatis
kyle~2 小时前
算法数学---差分数组(Difference Array)
java·开发语言·算法
zhaomx19892 小时前
Spring 事务管理 Transaction rolled back because it has been marked as rollback-only
数据库·spring
曹朋羽2 小时前
Spring EL 表达式
java·spring·el表达式
沐浴露z2 小时前
详解JDK21新特性【虚拟线程】
java·开发语言·jvm