Spring @Import

news/2024/9/28 10:16:40/

@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 {@Autowiredprivate OrderChoice orderChoice;@Testpublic 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 {@Overridepublic 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 {@Autowiredprivate OrderChoice orderChoice;@Autowiredprivate OrderChoiceTwo orderChoiceTwo;@Testpublic void testImportTwo() {orderChoice.printOrderMsg();orderChoiceTwo.printOrderMsg();}
}

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

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

java">public interface Order {void printOrderMsg();
}public class StudentOrder implements Order{@Overridepublic void printOrderMsg() {System.out.println("学生的订单信息...");}
}public class TeacherOrder implements Order{@Overridepublic void printOrderMsg() {System.out.println("老师的订单信息...");}
}

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

java">public class OrderTwoImportSelector implements ImportSelector {@Overridepublic 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 {@Autowiredprivate Order order;@Testpublic 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 {@Overridepublic 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 {@Autowiredprivate OrderRegistrar orderRegistrar;@Testpublic void test() {orderRegistrar.printOrderMsg();}
}


http://www.ppmy.cn/news/1531097.html

相关文章

学习react小记

系列文章目录 目录 系列文章目录 前言 一、关于Hook 1、useEffect 1.1 如果在 useEffect 中没有声明第二个参数&#xff08;依赖项数组&#xff09;&#xff0c;则会导致 useEffect 的行为有所不同。具体来说&#xff0c;以下是几种可能的情况&#xff1a; 1.1.1 没有依赖项数…

堆的数组实现

目录 一、堆 二叉树的顺序结构 堆的概念及结构 1.概念 2.堆的分类 (1)大堆 (2)小堆 二、利用数组(顺序结构)实现堆的过程 1.利用数组实现堆的思路 2.堆是用数组实现的&#xff0c;在数组中通过双亲找自己左右孩子、通过左右孩子找自己双亲的思路 2.1.思路 2.2.孩子与…

【Kubernetes】常见面试题汇总(二十九)

目录 81.简述你知道的几种 CNI 网络插件&#xff0c;并详述其工作原理。K8s 常用的CNI网络插件&#xff08;calico && flannel&#xff09;&#xff0c;简述一下它们的工作原理和区别。 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff…

uniapp webview清理缓存

uniapp webview清理缓存 后端服务器配置&#xff0c;JS/CSS文件的缓存时间为 &#xff1a;-1s location ~ .*.(js|css)?$ { expires -1s; error_log off; }前端打开webview页面处&#xff1a; //ios 禁用缓存&#xff0c;测试生效&#xff01;&#xff01; let cache1 plus.…

立体仓库WCS功能设计:物流自动化的智能核心

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 在现代物流的快速发展中&#xff0c;自动化立体仓库以其高效的空间利用率和节省人工的优势&#xff0c;成为了企业物流管理的关键。 而在这个自动化的生态系统中&#xff0c;Warehous…

【openwrt-21.02】openwrt PPTP Passthrough 不生效问题解决方案

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …

2024最新国内镜像源设置(npm、yarn、pnpm)

淘宝镜像源https://registry.npmmirror.com/ 腾讯云镜像源https://mirrors.cloud.tencent.com/npm/ cnpm是一个基于npm的中国镜像源https://r.cnpmjs.org/ # 查询当前使用的镜像源 npm get registry# 设置为淘宝镜像源 npm config set registry https://registry.npmmirror.co…

实时数字人DH_live使用案例

参看: https://github.com/kleinlee/DH_live ubuntu 测试 apt install ffmpeg 下载安装: git clone https://github.com/kleinlee/DH_live.git cd DH_liveconda create -n dh_live python=3.12 conda activate dh_live pip install -r requirements.txt pip install torch -…