SpringBoot usa @Autowired para injetar classes de implementação em coleções List ou Map

Prefácio

Recentemente, vi a classe de configuração do módulo RuoYi-Vue-Plusde tradução Translationda função de tradução TranslationConfig. Um dos TranslationInterfacemé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 Liste 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

  • ApplicationContextMétodo 1: Salve o objeto durante a inicialização
  • Método 2: obtenha o objeto por meio da classe SpringfornecidautilsApplicationContext
  • Método 3: herdar da classe abstrataApplicationObjectSupport
  • Método 4: herdar da classe abstrataWebApplicationObjectSupport
  • Método 5: Implementar a interfaceApplicationContextAware
  • Método 6: através Springdo 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 é TranslationInterfaceinterface de tradução

. Vamos dar uma olhada em suas classes de implementação.

Essas classes de implementação são definidas no pacote commondo módulo . As implementações de tradução de , , e , translationrespectivamente, 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用户名

SpringTranslationInterfaceList

DebugTranslationInterface

@AutowiredBeanMapMapDebug

Acho que você gosta

Origin blog.csdn.net/qq_31762741/article/details/132098537
Recomendado
Clasificación