【spring】@Import 注解学习

news2025/1/15 7:08:52

@Import 介绍

@Import 是 Spring 框架中的一个注解,用于导入配置类或组件。它可以将一个或多个配置类或组件导入到当前的配置类或组件中,从而实现配置的复用和组合。

在Spring Boot应用中,@Import注解可以帮助我们更加灵活地组织和管理配置类。

使用 @Import 注解时,需要指定要导入的配置类或组件的类名或数组。例如:

@Configuration
@Import( {ConfigA.class,  ConfigB.class} )
public class AppConfig {

    //  ...
}

@Import源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
	Class<?>[] value();
}
源代码截图

@Import 属性介绍

  • value:Class数组类型,用于指定其他配置类的字节码,支持指定多个配置类。另外,使用value属性指定的有一定的条件,必须是普通类、实现了ImportSelector接口的类和实现了ImportBeanDefinitionRegistrar接口的类。

@Import 使用场景

  1. 导入配置类:在 Spring 中,可以通过 @Configuration 注解定义配置类,然后在其他配置类中使用 @Import 注解导入该配置类,从而实现配置的复用和组合。例如,在 AppConfig 配置类中导入 ConfigA 和 ConfigB 两个配置类,可以将 ConfigA 和 ConfigB 中的配置应用到 AppConfig 中。

  2. 导入组件:在 Spring 中,可以通过 @Component 注解定义组件,然后在其他配置类中使用 @Import 注解导入该组件,从而将该组件注册到 Spring 容器中。例如,在 AppConfig 配置类中导入 ComponentA 和 ComponentB 两个组件,可以将 ComponentA 和 ComponentB 注册为 Spring 容器中的 Bean。

  3. 导入其他注解配置:在 Spring 中,除了 @Configuration 和 @Component 注解外,还有其他一些注解也可以用于配置,例如 @Bean@Service@Repository 等。在其他配置类中使用 @Import 注解导入这些注解配置,可以将这些配置应用到当前的配置类中。

  4. 如果在项目中需要引入第三方的类,并且需要将这些类的对象注入到IOC容器中,也可以使用@Import注解。

需要注意的是,@Import 注解只能用于 @Configuration 注解的配置类中,不能用于普通的 Java 类或接口中。同时,@Import 注解只能导入类,不能导入接口或枚举等其他类型的类。

@Import 测试示例代码

示例代码 一: 将普通Bean对象注入到IOC容器

ImportDemo 类
package com.yang.SpringTest.annotation.importLearn;


/**
 * <p>ImportDemo 类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:00
 */
@Data
public class ImportDemo {

}
配置类
package com.yang.SpringTest.annotation.importLearn;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * <p>配置类 </p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:01
 */
@Import(value = {ImportDemo.class})
@Configuration
public class ImportConfig {
}
测试类
package com.yang.SpringTest.annotation.importLearn;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;

/**
 * <p>测试类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:02
 */

public class ImportDemoTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ImportConfig.class);
        String[] definitionNames = context.getBeanDefinitionNames();
        Arrays.stream(definitionNames).forEach((definitionName) -> System.out.println(definitionName));
    }
}
运行结果

示例代码 二: 实现ImportSelector接口

将selectImports()方法返回的Bean数组注入到IOC容器,实现ImportSelector接口的类对象本身不会被注册到IOC容器中。

ImportSelectorDemoBean类
package com.yang.SpringTest.annotation.importLearn;

import lombok.Data;

/**
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:09
 */
@Data
public class ImportSelectorDemoBean {

}
ImportDemoSelector类
package com.yang.SpringTest.annotation.importLearn;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:11
 */

public class ImportDemoSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{ImportSelectorDemoBean.class.getName()};
    }
}
配置类
package com.yang.SpringTest.annotation.importLearn;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * <p>配置类 </p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:01
 */
@Import(value = { ImportDemoSelector.class})
@Configuration
public class ImportConfig {
}
 测试类
package com.yang.SpringTest.annotation.importLearn;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;

/**
 * <p>测试类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:02
 */

public class ImportDemoTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ImportConfig.class);
        String[] definitionNames = context.getBeanDefinitionNames();
        Arrays.stream(definitionNames).forEach((definitionName) -> System.out.println(definitionName));
    }
}
运行结果

示例代码 三: 实现ImportBeanDefinitionRegistrar接口

用registerBeanDefinitions()方法中的BeanDefinitionRegistry对象注入BeanDefinition对象到IOC容器中,实现ImportBeanDefinitionRegistrar接口的类对象本身不会被注册到IOC容器中。

ImportBeanDefinitionRegistrarDemoBean类
package com.yang.SpringTest.annotation.importLearn;

import lombok.Data;

/**
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:19
 */
@Data
public class ImportBeanDefinitionRegistrarDemoBean {
}
ImportBeanDefinitionDemoRegistrar类
package com.yang.SpringTest.annotation.importLearn;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * <p>description</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:22
 */

public class ImportBeanDefinitionDemoRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        String beanName = ImportBeanDefinitionRegistrarDemoBean.class.getName();
        BeanDefinition beanDefinition = new RootBeanDefinition(ImportBeanDefinitionRegistrarDemoBean.class);
        registry.registerBeanDefinition(beanName, beanDefinition);
    }
}
配置类 
package com.yang.SpringTest.annotation.importLearn;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * <p>配置类 </p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:01
 */
@Import(value = {ImportBeanDefinitionRegistrarDemoBean.class})
@Configuration
public class ImportConfig {
}
  测试类
package com.yang.SpringTest.annotation.importLearn;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;

/**
 * <p>测试类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.importLearn
 * Ceate Time 2024-03-14 14:02
 */

public class ImportDemoTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ImportConfig.class);
        String[] definitionNames = context.getBeanDefinitionNames();
        Arrays.stream(definitionNames).forEach((definitionName) -> System.out.println(definitionName));
    }
}
运行结果




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1519455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(学习日记)2024.03.09:UCOSIII第十一节:就绪列表

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

正点原子精英版TFTLCD代码移植

&#xff08;1&#xff09;将lcd.c和lcd.h加入到HEADWARE文件中 &#xff08;2&#xff09;将lcd.c加入到环境中 选择lcd.c即可。 &#xff08;3&#xff09;在FWLib中添加stm32f10x_fsmc.c

Spring Boot整合canal实现数据一致性解决方案解析-部署+实战

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1.前言 2.canal部署安装 3.Spring Boot整合canal 3.1数据库与缓存一致性问题…

一篇普通的生活周记

学习进度汇报&#xff1a; 这周主要是参考着视频敲完了一个vue2后台项目&#xff0c;主要是vue2element-ui,因为之前写项目的时候用过lay-ui&#xff0c;虽然是结合着node.js写的&#xff0c;但是大差不差&#xff0c;所以上手也很快。同时&#xff0c;学长发给我们了ruoyi项目…

【Vue3】Vue3中路由规则的 props 配置

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

页面侧边栏顶部固定和底部固定方法

顶部固定用于侧边栏低于屏幕高度----左侧边栏 底部固定用于侧边栏高于屏幕高度----右侧边栏 vue页面方法 页面布局 页面样式&#xff0c;因为内容比较多&#xff0c; 只展示主要代码 * {margin: 0;padding: 0;text-align: center; } .head {width: 100%;height: 88px;back…

Vue+SpringBoot打造高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

数据结构--线性表

1.线性表的定义&#xff1a; 存在唯一的一个被称为“第一个”的数据元素&#xff1b; 存在唯一的一个被称为“最后一个”的数据元素&#xff1b; 除第一个之外&#xff0c;集合中的每一个数据元素都只有一个前驱&#xff1b; 除最后一个之外&#xff0c;集合中的每一个数据…

安卓百度地图API显示隐藏Marker

方法 BaiduMap.Marker.setVisible(boolean) 实现 List<Marker> list_marker new ArrayList<>(); boolean isShowMarker true;Override public boolean onCreateOptionsMenu(Menu menu) {String[] sm { "显隐信息", "显隐照片", "截…

【Python】新手入门学习:详细介绍迪米特原则(LoD)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍迪米特原则&#xff08;LoD&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTor…

IDEA编译安卓源码TVBox(2)

一、项目结构&#xff1a;主要app和player app结构 二、增加遥控器按键选台 修改LivePlayActivity.java 1、声明变量 public String channelId "";public Timer timer new Timer();public Toast mToast;2、定义方法 private void mToastShow(String s){mToast …

数据结构(二)顺序表和链表

1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直…

鸿蒙车载原生开发,拓展新版图

一天内连发“五弹”、HiCar 4.0首次上车 华为鸿蒙狂扩“汽车朋友圈”-上游新闻 汇聚向上的力量 3月15日&#xff0c;在“华为云&华为终端云服务创新峰会2024”上&#xff0c;华为首批汽车行业伙伴广汽传祺、岚图汽车、零跑汽车、凯翼汽车加入鸿蒙生态合作&#xff0c;华为…

C语言:操作符详解(下)

目录 一、逗号表达式二、下标访问[ ]、函数调用()1. [ ]下标引用操作符2.函数调用操作符 三、结构成员访问操作符1.结构体(1) 结构的声明(2) 结构体变量的定义和初始化 2.结构成员访问操作符(1)结构体成员的直接访问(2)结构体成员的间接访问 四、操作符的属性&#xff1a;优先级…

搭建谷歌Gemini

前言 Gemini是Google AI于2023年发布的大型语言模型&#xff0c;拥有强大的文本生成、理解和转换能力。它基于Transformer模型架构&#xff0c;并使用了大量文本和代码数据进行训练。Gemini可以执行多种任务&#xff0c;包括&#xff1a; 生成文本&#xff1a;可以生成各种类…

蓝桥杯2022年第十三届省赛真题-灭鼠先锋

LLLV solution1 必输&#xff1a;只有一个格子 手算可以模拟出来~ solution2 OOOO状态下&#xff0c;谁先下谁必输 》问题转化为谁先下满第一排&#xff0c;谁必赢&#xff0c;可以非常容易的模拟出来

buuctf warmup 超详细

目录 1.代码审计&#xff1a; 2.逻辑分析 3.总结分析 4.分析记录 5.疑点解答 1.代码审计&#xff1a; <?phphighlight_file(__FILE__);class emmm //定义了一个类{public static function checkFile(&$page) 类里面又申明创建…

稀碎从零算法笔记Day18-LeetCode:移除链表元素

前言&#xff1a;接近20day的时间&#xff0c;终于来到了链表。 题型&#xff1a;指针、链表 链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你…

UE4_AI_行为树_行为树快速入门指南

声明&#xff1a;学习笔记。 在 行为树快速入门指南 中&#xff0c;你将学会如何创建一个敌方AI&#xff0c;该AI看到玩家后会做出反应并展开追逐。当玩家离开视线后&#xff0c;AI将在几秒钟后&#xff08;这可根据你的需求进行调整&#xff09;放弃追逐&#xff0c;并在场景中…

P1086 [NOIP2004 普及组] 花生采摘

题目描述 鲁宾逊先生有一只宠物猴&#xff0c;名叫多多。这天&#xff0c;他们两个正沿着乡间小路散步&#xff0c;突然发现路边的告示牌上贴着一张小小的纸条&#xff1a;“欢迎免费品尝我种的花生&#xff01;――熊字”。 鲁宾逊先生和多多都很开心&#xff0c;因为花生正…