1. 程式人生 > >TDW-JAVA-研發技術點紀錄

TDW-JAVA-研發技術點紀錄

1、使用@Async 註解 ,使用spring 非同步處理方法(https://blog.csdn.net/hry2015/article/details/67640534) 2、使用@Qualifier(用哪個),多個例項實現了一個介面,在注入的時候告訴spring用哪個 (https://www.cnblogs.com/smileLuckBoy/p/5801678.html) 3、冪等性,就是多次操作,結果都一樣。 比如,讀取一個檔案,1次和10次,讀出來的內容應該是一樣的。 4、RestTemplate,簡單來說就是,spring的一個操作rest風格的工具類,get,post,put,delete 隨便選擇

5、AtomicInteger

6、使用了靜態程式碼塊,靜態程式碼塊,會在載入類的時候就將靜態程式碼塊的內容載入到記憶體中。

7、使用了Map來做單例模式,抽象工廠模式

public class SendPrizeStrategyFactory {
    private static Map<Integer, SendPrizeStrategy> sendPrizeStrategyMap = Maps.newHashMap();//這裡定義一個空的Map

    static {
        ApplicationContext applicationContext = ApplicationContextHolder.context; //使用團貸網封裝好的工具
        SendPrizeStrategy baoxiangSendPrizeStrategy = applicationContext.getBean(TuanBaoxiangSendPrizeStrategy.class);//獲取例項,cglib實現原理,動態代理
        TuanBiSendPrizeStrategy tuanBiSendPrizeStrategy = applicationContext.getBean(TuanBiSendPrizeStrategy.class);
        SendPrizeStrategy ticketSendPrizeStrategy = applicationContext.getBean(TicketSendPrizeStrategy.class);

        // 紅包、實物類獎品使用 團寶箱服務傳送獎品
        sendPrizeStrategyMap.put(PrizesTypeId.RED_BONUSES_TYPE_ID, baoxiangSendPrizeStrategy);// 用Map裝入例項
        sendPrizeStrategyMap.put(PrizesTypeId.MATERIAL_GITF, baoxiangSendPrizeStrategy);

        // 團幣獎品使用 團幣服務傳送獎品
        sendPrizeStrategyMap.put(PrizesTypeId.TUANBI_TYPE_ID, tuanBiSendPrizeStrategy);
        // 抽獎券使用,補償抽獎券
        sendPrizeStrategyMap.put(PrizesTypeId.CARDS_TYPE_ID, ticketSendPrizeStrategy);
    }

    private SendPrizeStrategyFactory() {
    }

    public static void addSendPrizeStrategy(Integer prizesTypeId, SendPrizeStrategy sendPrizeStrategy) {
        if (!sendPrizeStrategyMap.containsKey(prizesTypeId)) {
            sendPrizeStrategyMap.put(prizesTypeId, sendPrizeStrategy);
        }
    }

    public static SendPrizeStrategy findStrategy(Integer prizesTypeId) {
        SendPrizeStrategy sendPrizeStrategy = sendPrizeStrategyMap.get(prizesTypeId);
        if (sendPrizeStrategy != null) {
            return sendPrizeStrategy;  //獲取例項
        }

        throw new AppBusinessException(Activity518ErrorCode.SEND_PRIZE_STRATEGY_NOT_FOUND);
    }

}

8、多次使用String.format(%sAAAA%s) ,來拼接字串,這樣效能會高些嗎?

9、多次使用策略模式,先定義一個抽象類,在這個抽象類裡面寫一些公用方法。新建立的類就繼承這個抽象類,並重寫抽象方法。這樣可以用呼叫不同的類,使用不同的方法。(這樣做法,在功能上來說,和switch的功能差不多,只是把case的內容放到一個類裡面去了,當然用繼承的方法去做的話,在別人看你的程式碼的時候就顯得更加高大上些,但是本質還是一樣的事情)

10、使用過了分散式鎖,目的,防止使用者多次提交。

// 獲取分散式鎖
            boolean isLock = jedisService.tryGetDistributedLock(coinLockKey, requestId, 100);
    /**
     * 嘗試獲取分散式鎖
     * @param lockKey 鎖
     * @param requestId 請求標識
     * @param expireTime 超期時間
     * @return 是否獲取成功
     */
    public boolean tryGetDistributedLock(String lockKey, String requestId, int expireTime) {
        RedisConnection conn = jedisConnectionFactory.getConnection();
        Jedis jedis = (Jedis) conn.getNativeConnection();
        String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
        conn.close();
        if (LOCK_SUCCESS.equals(result)) {
            return true;
        }
        return false;

    }

11、包裝類就使用包裝類的方法來進行比較數字

12、