基於註解的spring 在靜態方法中使用注入的類

yemengying發表於2015-10-14

部落格搬移到這裡:http://yemengying.com/
有個自己的部落格還蠻好玩的,bazinga!
在開發時遇到需要將多個來源的資料轉換為統一的格式,不同來源的資料轉換邏輯不同。所以想利用工廠模式 讓所有的轉換類繼承一個公有的類 然後在工廠類中根據不同的來源 返回不同的例項。比如在處理A資料來源時 返回AConverter,處理B資料來源時 返回BConverter
一開始的寫法:

@Component
public class ConverterFactory {

    @Resource
    private AConverter aConverter;
    @Resource
    private BConverter bConverter;
    @Resource
    private CConverter cConverter;

    public static POIConverter getConverter(String type) {
        switch (type) {
            case "a" : return aConverter;
            case "b" : return bConverter;
            case "c" : return cConverter;
        }
        return null;
    }
}

可是會報錯 因為靜態方法中不能使用非靜態的變數,而Resource註解不支援靜態屬性上新增。同事給出瞭解決方案 在初始化之後將包涵已經注入好各個converter的this付給一個靜態的變數factory 在getConverter方法中 通過factory來獲得注入的物件。

@Component
public class ConverterFactory {

    @Resource
    private AConverter aConverter;
    @Resource
    private BConverter bConverter;
    @Resource
    private CConverter cConverter;
    
    private static ConverterFactory factory;

    @PostConstruct
    public void init() {
        factory = this;
    }

    public static POIConverter getConverter(String type) {
        switch (type) {
            case "a" : return factory.aConverter;
            case "b" : return factory.bConverter;
            case "c" : return factory.cConverter;
        }
        return null;
    }

}

相關文章