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();
    }
}
相关推荐
Vic1010134 分钟前
Java 开发笔记:多线程查询逻辑的抽象与优化
java·服务器·笔记
Biaobiaone34 分钟前
Java中的生产消费模型解析
java·开发语言
特立独行的猫a1 小时前
11款常用C++在线编译与运行平台推荐与对比
java·开发语言·c++
louisgeek1 小时前
Java 位运算
java
hweiyu002 小时前
Maven 私库
java·maven
Boilermaker19922 小时前
【Java EE】SpringIoC
前端·数据库·spring
Super Rookie2 小时前
Spring Boot 企业项目技术选型
java·spring boot·后端
写不出来就跑路2 小时前
Spring Security架构与实战全解析
java·spring·架构
ZeroNews内网穿透3 小时前
服装零售企业跨区域运营难题破解方案
java·大数据·运维·服务器·数据库·tcp/ip·零售
sleepcattt3 小时前
Spring中Bean的实例化(xml)
xml·java·spring