Spring注解的(List&Map)特殊注入功能

基于SpringBoot的策略模式多实现类注入(Map注入) 1前言 在业务处理的过程中遇见一个场景,设备分A,B,C,他们都是对应的实现都是正删改查,但是不同的设备对应的增删改查业务逻辑有存在差异,这个时候如果不想办法设计代码就会出现A,B,C三个设备都要写一个对应接口(XXXserver),然后分别再去实现他们(XXXserverImpl),如果后来再增加一台设备D,我们又要去重复相关接口和实现,不仅显得代码冗余,更是不好维护和管理,所以利用设计模式---策略模式就解决了这个问题。 2基础知识 2.1对@Autowired注解的理解 在平常使用中我们对@A 阅读详情

今天偶然在网页留言上发现,有人说用@Autowired

可以注入bean到声明的map中,当时我还不信,怎么可能呢,@Autowired只用过向定义的类型中注入bean,map跟bean非亲非故,怎么会注入那些实例,于是试验了一下,果然灵验

@Autowired
private Map<String, BizService> map = new HashMap<>();//  向map中注入所有类型为BizService类型的bean,其中键为bean的名称,值为bean的实例.

像上面这些注入一个map,类型必须是这样: Map<String, T> map ,即: 键必须是String类型, 值可以是任意类型

这样的话,这个map就会将context中所有类型为T的bean都注入到这个map中了.

分析一下原理,也是很容易实现的,只不过以前没朝这方面想而已

在context启动过程中, 会加载所有的bean到bean工厂中,如果发现有用@Autowired标记的Map类型,那就注入

注入的时候,看map的值类型,然后遍历所有的bean,根据类型放进去就行了.

有了这个东西,以后遇到自定义的bean,都可以自动放入单独的map中,随时供自己调用和处理了,很是方便.

同理: List也可以根据bean的类型自动注入.原理同map.
=============补充=================

使用基于JSX-RS规范的@Inject注解不能注入,原因尚未探索.

一、先看一个示例演示:spring注解的一个特殊的注入功能。

首先,是定义一个接口,3个实现类。

public interface GreetService {

    public String sayHello(String name);
    
}
@Service("china")
public class ChinaGreetServiceImpl implements GreetService {

    @Override
    public String sayHello(String name) {
        return "你好";
    }

}
@Service("japan")
public class JapanGreetServiceImpl implements GreetService {

    @Override
    public String sayHello(String name) {
        return "亚麻得";
    }

}
@Service("usa")
public class UsaGreetServiceImpl2 implements GreetService {

    @Override
    public String sayHello(String name) {
        return "hello";
    }

}

下面看到代码中有直接注入一个List和一个Map的。示例代码如下:

GreetController代码:

@RestController
@RequestMapping("/greet")
public class GreetController {

    @Autowired
    private List<GreetService> greetServiceList;

    @Autowired
    private Map<String, GreetService> greetServiceMap;

    @RequestMapping(value = "/test/{id}", method = RequestMethod.GET)
    public String getbook5(@ApiParam("id编号") @PathVariable("id") Long id) {
        for (Map.Entry<String, GreetService> entry : greetServiceMap.entrySet()) {
            System.out.println(entry.getValue().sayHello("" + id));
        }
        System.out.println("==list====");
        for (GreetService greetService : greetServiceList) {
            System.out.println(greetService.sayHello("" + id));
        }

        return "" + id;
    }

}

最后在调试List的时候突然灵感一闪,如果只有一个对象那么List里面的值不就只有一个吗。于是开始测试验证,结果发现的确如此。当实例化一个GreetController之后,另外一个类采用泛型注入List,Spring竟然成功的将实例化的对象放入List之中。思路打开之后,针对Map的就更好说了。Spring会将service的名字作为key,对象作为value封装进入Map。

运行之后,访问http://127.0.0.1:8091/greet/test/1执行结果如下:

原来,在不知不觉中Spring已经帮我们做了很多事情,只是我们不知道而已。

 二、@Autowired 注入集合类型

从spring-beans-4.3.14.RELEASE.jar的源码可以看看到如下:

在org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DependencyDescriptor, String, Set<String>, TypeConverter) 方法中发现了原因。

对于@Autowired声明的数组、集合类型,spring并不是根据beanName去找容器中对应的bean,而是把容器中所有类型与集合(数组)中元素类型相同的bean构造出一个对应集合,注入到目标bean中。对应到上问配置文件中,就是把容器中所有类型为java.lang.String的bean放到新建的Set中,然后注入到Manager bean中。也就是把resourcePackage和resourceLoaction这两个String注入了,导致上面的输出结果。

在spring reference中也发现相关说明。

@Autowired

If you intend to express annotation-driven injection by name, do not primarily use @Autowired, even if is technically capable of referring to a bean name through @Qualifier values. Instead, use the JSR-250 @Resource annotation, which is semantically defined to identify a specific target component by its unique name, with the declared type being irrelevant for the matching process.
As a specific consequence of this semantic difference, beans that are themselves defined as a collection or map type cannot be injected through @Autowired, because type matching is not properly applicable to them. Use @Resource for such beans, referring to the specific collection or map bean by unique name.
@Autowired applies to fields, constructors, and multi-argument methods, allowing for narrowing through qualifier annotations at the parameter level. By contrast, @Resource is supported only for fields and bean property setter methods with a single argument. As a consequence, stick with qualifiers if your injection target is a constructor or a multi-argument method.

从上面的说明中找到解决办法就是注入集合类型不要使用@Autowired,而使用@Resource注解。同时Spring官方也是不推荐使用@Autowired的。

SIwave串扰分析保姆级教程:从Allegro文件导入到结果解读,手把手教你排查PCB信号问题 本文提供SIwave串扰分析的详细教程,从Allegro文件导入到结果解读,手把手教你排查PCB信号问题。涵盖环境准备、参数配置、串扰扫描技巧及实战案例,帮助工程师精准定位和解决高速PCB设计中的串扰问题,提升信号完整性分析能力。 阅读详情

相关推荐

Python+pytest+requests 自动化测试框架

环境准备 本次选用的是Python+Pytest+requests来搭建自动化框架,需要有 Python 环境(3.x 版本),安装pytest和requests,不会安装的自行去网上搜教程。 关于 Pytest 的基本使用,这里不作讲解,不清楚的可以看我之前的文章。 简单 Demo 我们先创建一个项目,取名api-test,然后在下面创建一个test_api.py的文件 # test_api.py import pytest import requests def test_01():

weixin_42686892的博客 1万+

Spring的Map注入原理

此处解析map,需要注意的是key的类型一定要是String,用来存放beanName,value就是对应的BeanType,否则就不会继续解析。注:单个类型的Bean和多个类型的Bean匹配逻辑是同一套,只不过单个Bean如果匹配到多个符合条件的候选项的情况下,最终会通过Bean名称进行匹配。参数类型如果是数组,Collection,Map类型则会被此方法解析,如果是单个对象则会被findAutowireCandidates方法进行解析。此处开始真正的解析参数获取Bean对象。将匹配的Bean进行返回。

m0_48767062的博客 1821

将AAL图谱对应到Yeo7大网络中【原理,代码分析】

本文介绍了将AAL2图谱映射到Yeo7大功能网络的方法。通过整合皮层(Yeo2011)、小脑(Buckner2011)和纹状体(Choi2012)三个区域的功能网络图谱,采用投票机制确定每个AAL区域的网络归属。具体步骤包括:1)统计每个AAL区域体素在各网络图谱中的分布;2)选择体素数量最多的网络作为该区域的最终标签。该方法实现了从解剖结构到功能网络的映射,可获得120个AAL区域对应的7大功能网络标签。

yes666666的博客 2204

Spring 结合策略模式,如何优雅的实践(普通注入,Map注入,自定义注解注入)

Spring 结合策略模式,优雅的实践(普通注入,Map注入,自定义注解注入)

Crazy_Cw的博客 4641

SAP FI 提示没有为会计年度0 定义版本2025 GP626

SAP 错误 GP626 是一个常见的系统消息,通常表示某个会计年度的版本(如版本 0)未被定义或未激活。:在执行某些事务(如创建采购订单、过账凭证或维护成本中心)时,系统会检查相关版本是否已定义。的“Settings for Each Fiscal Year”界面中,选择一个已激活的会计年度。的“Settings for Each Fiscal Year”界面中,找到未激活的会计年度。:在控制范围(Controlling Area)中,未为指定的会计年度定义版本 0。如果没有,添加或复制现有年度的设置。

GAVIN 2489

华为eNSP与VMware虚拟机联动实战:从零搭建仿真网络环境

本文详细介绍了如何从零开始搭建华为eNSP与VMware虚拟机的联动仿真网络环境。通过环境准备、网络适配器配置、eNSP与VMware网络集成、安全策略与NAT配置等步骤,帮助读者掌握构建企业级网络实验场景的关键技术。这种组合特别适合网络工程师进阶训练和华为认证考试准备,实现低成本、高灵活性的网络仿真实验。

weixin_30415113的博客 502

spring自动注入的原理与实现

然后,有一个 `getMapArrayToString` 方法,它接受一个 `Map` 类型的参数,并返回一个 `Map` 类型的对象。该方法将遍历输入的 `map` 对象,将每个键值对中的字符串数组转换为以逗号分隔的字符串,并将结果存储在新的 `map1` 对象中。接着,有一个重载的 `getBean` 方法,它接受一个 `Class` 类型和一个 `Map` 类型的参数,并返回一个泛型对象。

D97756228的博客 523

企业数字化建设之——品牌零售全渠道运营中台解决方案

OMS审单 --> 订单进入OMS待发货列表区域 --> 备货(线下)-->拣货((线下 )-->质检(线下)--> 包装(线下)--> 快递员取货(线下)(物品 + 客户收货地址清单 )--> 快递员发货(2.2.5 正常退货,客户发起 --> 客服助理审核 --> 评审组 --> ( 货物运输 ) -->质检 ->仓库收货入 正常仓库 -->财务退款,记账。OMS审单 --> 订单进入物流公司系统(如:*丰),--> 快递员发货 --> 物流状态同步OMS --> OMS同步物流状态到销售平台。

java_zhong1990的专栏 612

Spring注入 Bean 到 List / Map 中

通过Spring注入Bean到List和Map中,我们可以轻松地管理和使用一组Bean对象。只需在配置文件中定义Bean对象并注入到集合类型中,然后在代码中使用依赖注入进行引用。这种方式使得我们可以更灵活地处理和配置多个Bean对象,提高了代码的可维护性和可扩展性。以上便是Spring注入Bean到List/Map中的简单介绍和示例。希望能帮助你更好地使用Spring框架进行开发。在实际开发中,我们经常需要将多个实现了相同接口的Bean对象注入到一个List或Map中。

牛肉胡辣汤 1633

存储硬盘格式怎么把512还原为520格式??

硬盘厂商工具(如SeaChestsg_format)可以调整扇区大小。备份数据,因为调整扇区会清除硬盘内容。根据硬盘型号和接口类型,选择合适的工具进行调整。如果你需要更详细的帮助,请提供你的硬盘型号和存储设备类型。希望如上措施及解决方案能够帮到有需要的你。PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

**My Coding Family** 1142

全国青少年信息素养大赛图形化(Scratch)编程考点总结

全国青少年信息素养大赛图形化(Scratch)编程考点总结

伶俐角少儿编程 382

基于卷积神经网络的遥感图像地物分类

AI:89-基于卷积神经网络的遥感图像地物分类 基于卷积神经网络的遥感图像地物分类是一个令人兴奋的领域,它在环境监测、城市规划、农业、国防等领域具有广泛的应用。深度学习技术为我们提供了更准确、高效的工具,有望在未来进一步提高分类性能。在本文中,我们探讨了卷积神经网络的工作原理、数据准备、模型构建、训练和评估过程,并提供了多个代码示例。此外,我们讨论了地物分类的应用和挑战,以及未来的发展趋势。

一键难忘的博客 2717

详解 Spring注解的(List&Map)特殊注入功能

详解 Spring注解的(List&Map)特殊注入功能

heikeb的专栏 282

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

spring注入接口类型的List、Map

目录 前言 例子 前言 关于spring中注入接口类型的List、Map有个比较有意思的点,会自动注入接口的实现类到List、Map中。 例子 首先新建一个接口 public interface Shape { } 新建两个这个接口的实现类 @Service public class Rectangle implements Shape { public Rectangle() { System.out.println("Rectangle 实例化输出")

weixin_42640226的博客 1823

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

spring依赖注入 集合<list>与<map>属性的注入

spring中和属性的依赖注入list集合属性的依赖注入map集合属性的依赖注入 在spring中可以通过一组内置的xml标签来配置集合属性 list集合属性的依赖注入 创建Car类,有brand(品牌),crop(厂商),price(价格)三个属性 创建PersonList类,有name和Car(Object)两个属性 创建spring-di.xml配置文件,在配置文件中已经创建好了car car2 car3三个car对象 配置一个PersonList <bean id="personLis

weixin_44141172的博客 2403

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

spring 基本类型,list,set,map类型的注入

基本数据类型的注入 property <bean id="use" class="entity.user" > <property name="name" value="张三"></property> <property name="eag" value="20"></property> </bean> 有参构造注入 constructor-arg <bean id="use2"

weixin_55042288的博客 440

spring注入list集合

spring可以帮助我们自动的完成bean属性的注入,其中有一个比较特殊的,就是list集合 spring中,在使用@Autowired注解注入list集合的时候,并不会根据注入属性值的类型去容器中查找,而是根据list集合的元素类型,从spring容器中找到所有的实现类,放在list集合中,然后注入到bean中 ...

小小少年的博客 1万+

Spring教程——Spring注入集合

在Spring中,我们可以使用集合(Collection)来管理一组Bean。集合可以是List、Set、Map等类型,而Spring框架支持将集合注入到Bean的属性中,从而实现依赖注入。

Itmastergo的博客 1028

Spring @Value@Configuration注入map、List、Bean,注入失败看这篇就够了

spring @Value@Configuration注入map、List、Bean看这篇就够了

aattxx的博客 4025

原理探究:Spring @Autowired注解详解

Autowired@ResourceSpring定义的注解JSR-250定义的注解一个参数:required(默认true),表示是否必须注入七个参数:最重要的两个参数是name、type默认按类型自动装配默认按名称自动装配默认按类型自动装配如果要按名称自动装配,需要使用@Qualifier一起配合默认按名称自动装配如果指定了name,则按名称自动装配;如果指定了type,则按类型自动装配作用范围:构造器、方法、参数、成员变量、注解作用范围:类、成员变量、方法。

qq_39093474的博客 1064

Autowired注解对MAP类型的特殊之处

Autowired注解 程序逻辑往往就是if-else,少量还好,多则不好维护,不易扩展,这个时候策略模式就能解决这个痛点 通过Autowired注解,注入map @Autowired标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类 型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key。 需要注意的是:应用于map的时候key必须为String类型(实现类的名字) @A

会飞的架狗师的博客 1158
上一篇: mysql字符串和数字的互相转换
下一篇: spring注入map,spring注入一个接口的多个实现类在map里
qq_34412985
博客等级 码龄11年 143粉丝 983原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值