前言
最近看到RuoYi-Vue-Plus
翻译功能 Translation
的翻译模块配置类TranslationConfig
,其中有一个注入TranslationInterface
翻译接口实现类的写法让我感到很新颖,但这种写法在Spring 3.0版本以后就已经支持注入List
和Map
,平时都没有注意到这一块,故此记录一下这种写法。
之前的做法
之前一般定义策略模式+工厂模式
结合Spring上下文的Aware回调
拿到指定类型Bean对象
,这里列举一些能拿到指定类型Bean
的方法:
- 方法一:在初始化时保存
ApplicationContext
对象 - 方法二:通过
Spring
提供的utils
类获取ApplicationContext
对象 - 方法三:继承自抽象类
ApplicationObjectSupport
- 方法四:继承自抽象类
WebApplicationObjectSupport
- 方法五:实现接口
ApplicationContextAware
- 方法六:通过
Spring
提供的ContextLoader
翻译模块配置类
TranslationConfig
这里是翻译配置初始化的地方文章来源:https://www.toymoban.com/news/detail-633663.html
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
翻译接口
我们来看一下它的实现类
这些实现类定义在common
模块的translation
包下,分别是部门
、字典
、OSS
、用户名
的翻译实现Spring
会扫描TranslationInterface
翻译接口实现类注入到List
我们来Debug
看一下效果,可以看到TranslationInterface
翻译接口的实现类确实全部已经注入进来了
由于@Autowired
注解还可以注入Bean
到Map
中,这里我们手动加上Map
集合,Debug
断点调试一下:
文章来源地址https://www.toymoban.com/news/detail-633663.html
到了这里,关于SpringBoot使用@Autowired将实现类注入到List或者Map集合中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!