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();
    }
}
相关推荐
小旋风-java14 分钟前
springboot整合dwr
java·spring boot·后端·dwr
JAVA坚守者19 分钟前
Maven常见解决方案
java·maven
聊天宝快捷回复30 分钟前
必收藏,售后客服日常回复必备的话术 (精华版)
java·前端·数据库·经验分享·微信·职场发展·快捷回复
wanyuanshi32 分钟前
map的键排序方法
java·数据结构·算法
热爱前端的小wen35 分钟前
maven的介绍与安装
java·spring·maven·springboot
追风小老头折腾程序1 小时前
Java单体服务和集群分布式SpringCloud微服务的理解
java·后端·spring·spring cloud
java_heartLake1 小时前
设计模式之观察者模式
java·观察者模式·设计模式
2401_857617621 小时前
Spring Boot电商开发:购物商城系统
java·spring boot·后端
你不要在理我了2 小时前
Thinkphp5x远程命令执行 靶场攻略
java·后端·spring