Como usar a injeção automática com elegância para implementar o padrão de estratégia no Spring Boot

Prefácio

Descrição do relacionamento: PayService é a interface de pagamento e o principal método de negócios é epay(). Essa interface possui várias classes de implementação diferentes.
Requisitos: A lógica de qual classe de implementação precisa ser decidida dinamicamente em tempo de execução.

solução

Primeiro, o código do produto final:

@Service
public class RouteService {
    
    
 
    @Autowired
    Set<PayService> payServiceSet;
    
    Map<String, PayService> payServiceMap;
 
    public PayResult epay(PayRequest payRequest) {
    
    
        PayService payService = payServiceMap.get(payRequest.getChannelNo());
        return  payService.epay(payRequest);
    }
 
    @PostConstruct
    public void init() {
    
    
        for (PayService payService : payServiceSet) {
    
    
            payServiceMap = new HashMap<>();
            payServiceMap.put(payService.channel(), payService);
        }
    }
}

análise de código

Usar Set<PayService>um tipo fará com que o Spring PayServiceinjete todas as classes que implementam a interface no Set.

@Autowired
Set<PayService> payServiceSet;

Map<String, PayService>Usado para salvar o relacionamento de mapeamento entre classes de implementação e lógica de julgamento de chamada.

Map<String, PayService> payServiceMap;

O método init decorado com @PostConstructanotações será executado automaticamente quando o contêiner Spring for iniciado, onde o mapa de mapeamento é construído.
O método payService channel()vem da definição da interface. A interface PayService requer que cada classe de implementação implemente este método, e este método retornará o identificador exclusivo de diferentes classes de implementação.

@PostConstruct
public void init() {
    
    
    for (PayService payService : payServiceSet) {
    
    
        payServiceMap = new HashMap<>();
        payServiceMap.put(payService.channel(), payService);
    }
}

Ao chamar, o parâmetro de solicitação deve carregar um identificador exclusivo para indicar qual classe de implementação precisa ser usada para esta chamada, que é o valor da Chave no mapa de mapeamento acima.

public PayResult epay(PayRequest payRequest) {
    
    
   PayService payService = payServiceMap.get(payRequest.getChannelNo());
   return  payService.epay(payRequest);
}

Artigo de referência

Implemente rapidamente o padrão de estratégia usando injeção automática Spring

Acho que você gosta

Origin blog.csdn.net/Ka__ze/article/details/132533232
Recomendado
Clasificación