SpringBoot使用@Autowired将实现类注入到List或者Map集合中

这篇具有很好参考价值的文章主要介绍了SpringBoot使用@Autowired将实现类注入到List或者Map集合中。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近看到RuoYi-Vue-Plus翻译功能 Translation的翻译模块配置类TranslationConfig,其中有一个注入TranslationInterface翻译接口实现类的写法让我感到很新颖,但这种写法在Spring 3.0版本以后就已经支持注入ListMap,平时都没有注意到这一块,故此记录一下这种写法。

之前的做法

之前一般定义策略模式+工厂模式结合Spring上下文的Aware回调拿到指定类型Bean对象,这里列举一些能拿到指定类型Bean的方法:

  • 方法一:在初始化时保存ApplicationContext对象
  • 方法二:通过Spring提供的utils类获取ApplicationContext对象
  • 方法三:继承自抽象类ApplicationObjectSupport
  • 方法四:继承自抽象类WebApplicationObjectSupport
  • 方法五:实现接口ApplicationContextAware
  • 方法六:通过Spring提供的ContextLoader

翻译模块配置类

TranslationConfig这里是翻译配置初始化的地方

package com.ruoyi.framework.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.annotation.TranslationType;
import com.ruoyi.common.translation.TranslationInterface;
import com.ruoyi.common.translation.handler.TranslationBeanSerializerModifier;
import com.ruoyi.common.translation.handler.TranslationHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 翻译模块配置类
 *
 * @author Lion Li
 */
@Slf4j
@Configuration
public class TranslationConfig {

    @Autowired
    private List<TranslationInterface<?>> list;

    @Autowired
    private ObjectMapper objectMapper;

    @PostConstruct
    public void init() {
        Map<String, TranslationInterface<?>> map = new HashMap<>(list.size());
        for (TranslationInterface<?> trans : list) {
            if (trans.getClass().isAnnotationPresent(TranslationType.class)) {
                TranslationType annotation = trans.getClass().getAnnotation(TranslationType.class);
                map.put(annotation.type(), trans);
            } else {
                log.warn(trans.getClass().getName() + " 翻译实现类未标注 TranslationType 注解!");
            }
        }
        TranslationHandler.TRANSLATION_MAPPER.putAll(map);
        // 设置 Bean 序列化修改器
        objectMapper.setSerializerFactory(
            objectMapper.getSerializerFactory()
                .withSerializerModifier(new TranslationBeanSerializerModifier()));
    }

}

可以看到在这个配置类中注入了一个List集合,其类型为TranslationInterface翻译接口
SpringBoot使用@Autowired将实现类注入到List或者Map集合中,spring boot,后端,java,ruoyi,spring
我们来看一下它的实现类
SpringBoot使用@Autowired将实现类注入到List或者Map集合中,spring boot,后端,java,ruoyi,spring
这些实现类定义在common模块的translation包下,分别是部门字典OSS用户名的翻译实现
SpringBoot使用@Autowired将实现类注入到List或者Map集合中,spring boot,后端,java,ruoyi,spring
Spring会扫描TranslationInterface翻译接口实现类注入到List
SpringBoot使用@Autowired将实现类注入到List或者Map集合中,spring boot,后端,java,ruoyi,spring
我们来Debug看一下效果,可以看到TranslationInterface翻译接口的实现类确实全部已经注入进来了
SpringBoot使用@Autowired将实现类注入到List或者Map集合中,spring boot,后端,java,ruoyi,spring
由于@Autowired注解还可以注入BeanMap中,这里我们手动加上Map集合,Debug断点调试一下:
SpringBoot使用@Autowired将实现类注入到List或者Map集合中,spring boot,后端,java,ruoyi,spring文章来源地址https://www.toymoban.com/news/detail-633663.html

到了这里,关于SpringBoot使用@Autowired将实现类注入到List或者Map集合中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring】Spring 可以将接口所实现的类都注入到接口类型的List、Map中

    Spring 提供了依赖注入的功能,可以通过注解或者配置来实现将接口的实现类注入到接口类型的 List、Map 中。 @Autowired 是重点!除此之外, @RequiredArgsConstructor 也可以代替他的功能。参考【注解】@RequiredArgsConstructor 按需自动生成构造函数,举例说明 Spring自动扫描组件 : 如果你

    2024年01月23日
    浏览(49)
  • java中,将List<Map>转为List<实体>或者List<实体>转为List<Map>

    1、ListMap转List实体  2、List实体转ListMap

    2024年01月24日
    浏览(34)
  • 使用java8 新特性stream流对List<Map<String, Object>>集合进行遍历、过滤、查询、去重、排序、分组

    对于一个ListMapString, Object类型的数据,可以使用Java 8的新特性stream流来进行遍历、过滤、查询、去重、排序、分组等操作。 遍历: 过滤: 查询: 去重: 排序: 分组:

    2024年02月10日
    浏览(46)
  • 集合List和Map

    初始化后ArrayList添加元素的步骤 首先计算数组的容量,如果当前数组已使用长度+1后的大于当前的数组长度,则调用grow方法扩容(原来的1.5倍),确保新增的数据有地方存储之后,则添加元素到size的位置上。返回添加成功布尔值。 用Arrays.asList转List后,如果修改了数组内容,

    2024年02月13日
    浏览(34)
  • springboot中@Autowired 注入失效的四种原因及解决方法

    1. 被注入的对象没有加载到spring容器中 通常是因为被注入的对象没有被spring扫描到,此时需要添加对应的包扫描路径。 2. 需要自动注入的对象不是spring加载,而是new的方式创建 由于对象不是spring创建的,当然spring也就无法根据注解自动注入对应的实例对象。 此时可以采用代

    2024年02月16日
    浏览(24)
  • Java集合(List、Set、Map)

    Java中的集合是用于存储和组织对象的数据结构。Java提供了许多不同的集合类,包括List、Set和Map等,以满足不同的需求。下面将介绍一些常见的Java集合类及其使用方法。 一、List List是一个有序的集合,它允许元素重复出现,并提供了索引访问元素的功能。List可以通过以下方

    2024年02月16日
    浏览(30)
  • Java-集合框架-List,Set,Map,队列

    Java集合框架是一组用于存储和操作数据的类和接口。它提供了不同类型的集合,如List,Set,Map和队列,以满足不同的需求。 List:有序的集合,允许重复的元素。 Set:无序的集合,不允许重复的元素。 Map:键值对的集合,每个元素都包含一个键和一个值。 队列:先进先出(

    2024年02月11日
    浏览(38)
  • Java的集合类:List、Set、Map

    在 Java 中,集合类是一组有序或无序的数据元素的集合。Java 集合类可用于存储和操作各种数据类型的元素,如整数、字符串、对象等。集合类是动态的,可以在运行时根据需要调整其大小。 Java 集合类可以分为三类: List - 有序集合,允许重复元素 Set - 无序集合,不允许重

    2024年02月16日
    浏览(36)
  • SpringMVC 的参数绑定之list集合、Map

    标签中name属性的值就是pojo类的属性名 参数绑定4 list [对象] form action=\\\"teaupd.do\\\" method=\\\"post\\\"     c:forEach items=\\\"${list}\\\" var=\\\"tea\\\" varStatus =\\\"status\\\"         教师编号:input type=\\\"text\\\" name=\\\"teas[${status.index}].teaid\\\" value=\\\"${tea.teaid}\\\"br/         教师姓名:input type=\\\"text\\\" name=\\\"teas[${status.index}]

    2024年02月22日
    浏览(34)
  • Java8 - 将 List 集合转为 Map

    1. 将List转为Map:key=userId, value=name 输出: 2. 将List转为Map:key=userId, value=User对象 输出: 3. 重复的 key 处理 如果出现相同的key,那么会抛出重复key的异常,比如我们将userId为3的修改为2,则会和第二个用户冲突: 抛出异常: Collectors.toMap支持第三个参数,对重复值进行选取:

    2024年02月08日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包