Prefácio
Recentemente, vi a classe de configuração do módulo RuoYi-Vue-Plus
de tradução Translation
da função de tradução TranslationConfig
. Um dos TranslationInterface
métodos de escrita que injeta a classe de implementação da interface de tradução me faz sentir muito novo. No entanto, esse método de escrita tem suporte para injeção List
e após a versão 3.0 do Spring Map
. Geralmente não o faço. observe isso. Então registre essa maneira de escrever.
abordagem anterior
Anteriormente, as definições eram geralmente 策略模式+工厂模式
combinadas Spring上下文的Aware回调
para obtê-las . Aqui estão alguns métodos 指定类型Bean对象
para obter tipos especificados :Bean
ApplicationContext
Método 1: Salve o objeto durante a inicialização- Método 2: obtenha o objeto por meio da classe
Spring
fornecidautils
ApplicationContext
- Método 3: herdar da classe abstrata
ApplicationObjectSupport
- Método 4: herdar da classe abstrata
WebApplicationObjectSupport
- Método 5: Implementar a interface
ApplicationContextAware
- Método 6: através
Spring
do fornecidoContextLoader
Classe de configuração do módulo de tradução
TranslationConfig
É aqui que a configuração da tradução é inicializada
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()));
}
}
Você pode ver que uma coleção é injetada nesta classe de configuração List
, seu tipo é TranslationInterface
interface de tradução
. Vamos dar uma olhada em suas classes de implementação.
Essas classes de implementação são definidas no pacote common
do módulo . As implementações de tradução de , , e , translation
respectivamente, serão verifica as classes de implementação da interface de tradução. Injetadas em Vamos dar uma olhada no efeito. Podemos ver que todas as classes de implementação da interface de tradução foram realmente injetadas. Como as anotações também podem ser injetadas , aqui adicionamos manualmente a coleção e a depuramos com pontos de interrupção:部门
字典
OSS
用户名
Spring
TranslationInterface
List
Debug
TranslationInterface
@Autowired
Bean
Map
Map
Debug