利用@Autowired和@Resource完成外观模式(门面模式)

79 阅读1分钟

1、案例分析

在常日迭代中发现在调用三方查询用户卡列表的接口有接近4s的耗时。而在支付过程中很容易导致接口的超时。当时排查到对应的问题以后,秉着最小改动原则使用外观模式包装一层。

2、oldService

public interface ICardAssetService {
    
    List<CardDTO> queryUserCardAsset();
}
@Service
public class CardAssetService implements ICardAssetService {
    @Override
    public List<CardDTO> queryUserCardAsset() {
        //todo 这边直接调用三方服务
        ArrayList<CardDTO> cardDTOS = new ArrayList<>();
        CardDTO cardDTO = new CardDTO();
        cardDTOS.add(cardDTO);
        System.out.println("调用三方接口成功");
        return cardDTOS;
    }
}
@SpringBootTest
class ProjectApplicationTests {

    // 最开始外部服务使用的是@Autowired注解
    @Autowired
    private ICardAssetService cardAssetService;



    @Test
    void contextLoads() {
        cardAssetService.queryUserCardAsset();
    }

}

结果:

3、新增 CacheCardAssetService

@Service("cardAssetService")
public class CacheCardAssetService implements ICardAssetService {

    @Autowired
    private ICardAssetService cardAssetService;

    @Override
    public List<CardDTO> queryUserCardAsset() {

        // 1. 缓冲中查询卡信息
        List<CardDTO> cardDTOS = queryCardAssetFromCache();
        // 2. 未命中缓存则调用外部服务查询
        if (CollectionUtils.isEmpty(cardDTOS)) {
            cardDTOS = cardAssetService.queryUserCardAsset();
            setCardAssetToCache(cardDTOS);
        }
        return cardDTOS;
    }

    private List<CardDTO> queryCardAssetFromCache() {
        ArrayList<CardDTO> cardDTOS = new ArrayList<>();
        cardDTOS.add(new CardDTO());
        return cardDTOS;
    }

    private void setCardAssetToCache(List<CardDTO> cardDTOS) {
        System.out.println("设置成功");
    }

}
package com.coding.project;

import javax.annotation.Resource;

import com.coding.project.card.service.ICardAssetService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ProjectApplicationTests01 {

    @Resource
    private ICardAssetService cardAssetService;



    @Test
    void contextLoads() {
        cardAssetService.queryUserCardAsset();
    }

}

\

注意的是我们在注入bean对象时,使用的是@Resource 。而在cacheService使用了@Autowired注解。外部服务所有的注入方式都需要由@Autowired改为@Resource 的方式注入bean。

巧妙地运用Autowired使用的是byType的方式注入。Resource使用的是byName的方式注入