Spring的InitializingBean接口解析
Spring的InitializingBean接口解析
之前知道spring的InitializingBean,但是沒怎么關(guān)注,最近在一次代碼改造的使用工廠模式和策略模式的情況下,發(fā)現(xiàn)InitializingBean。
InitializingBean是spring為bean的初始化提供了一種新的方式,里面只有一個方法afterPropertiesSet,作用就是實現(xiàn)這個接口或者實現(xiàn)了繼承InitializingBean的方法的bean都要執(zhí)行這個方法。
舉個例子:
@Component import org.springframework.beans.factory.InitializingBean; public class TestInitializingBean implements InitializingBean{ @Override public void afterPropertiesSet() throws Exception { System.out.println(" 張鵬真的很帥 InitializingBean"); } public void testInit(){ System.out.println("張鵬真的很帥"); } }
調(diào)起spring程序會打印出
張鵬真的很帥 InitializingBean
這個單個看起來沒啥用,但是結(jié)合實際情況就不一樣 比如說我想在下面這個工廠類里面的map添加值
@Component public class ValidAssetByTypeFactory { private static Map<String,ValidateAssetService> validAssetTypeMap = new HashMap<>(); /** * 用來維護(hù)根據(jù)類型驗證資產(chǎn)的規(guī)則的map * @param type * @return */ public static ValidateAssetService getInvokeStrategyMap(String type){ return validAssetTypeMap.get(type); } }
實際上這個validAssetTypeMap ,這個map是靜態(tài)的你要是真要想往里面塞值的話,只能在這個類下面寫個靜態(tài)方法或者一個一個靜態(tài)塊往這個map里面塞值,類似這樣:
static { validAssetTypeMap.put ("A","AStragey"); validAssetTypeMap.put ("B","BStragey"); validAssetTypeMap.put ("C","CStragey"); }
但是有了這個InitializingBean,可以這么玩:
(1)我先實現(xiàn)一個InitializingBean的接口
public interface ValidateAssetService extends InitializingBean { Result<List<DetailsAppAsset>> validateAssetByType(List<AssetDO> assetDOList,String type); }
(2)我在這個工廠類里面添加一個靜態(tài)的方法,用來往這個靜態(tài)map添加值
注意這個register方法
public class ValidAssetByTypeFactory { private static Map<String,ValidateAssetService> validAssetTypeMap = new HashMap<>(); /** * 用來維護(hù)根據(jù)類型驗證資產(chǎn)的規(guī)則的map * @param type * @return */ public static ValidateAssetService getInvokeStrategyMap(String type){ return validAssetTypeMap.get(type); } /** * 注冊(創(chuàng)建實現(xiàn)類直接注冊即可,不需要在該類放進(jìn)策略map里面) * @param type * @param validateAssetService */ public static void register(String type, ValidateAssetService validateAssetService){ if(StringUtil.isEmpty(type)||null == validateAssetService){ return; } validAssetTypeMap.put(type,validateAssetService); } }
(3)由于上一步給我們往靜態(tài)map添加值留了一個口子,我們要利用InitializingBean初始化會執(zhí)行afterPropertiesSet的特性在spring執(zhí)行起來的時候直接調(diào)用這個方法往靜態(tài)map里面塞值。
注意這個afterPropertiesSet方法的實現(xiàn):
@Component public class RepairAssetValidate implements ValidateAssetService { @Override public Result<List<DetailsAppAsset>> validateAssetByType(List<AssetDO> assetDOList, String type) { if( CollUtil.isEmpty(assetDOList) ){ return resultCreator.create(AssetErrorCode.ASSET_NOT_EXISTS, EntityConverter.convertList(assetDOList, DetailsAppAsset.class)); } for(AssetDO assetDO : assetDOList){ if( assetDO.getQuoteOrderId() != null ){ return resultCreator.create(AssetValidErrorCode.ASSET_IN_OTHER_OPERATOR,"資產(chǎn)已被"+ QuoteOrderType.getQuoteOrderType(assetDO.getQuoteOrderType())+"引用" ,EntityConverter.convertList(assetDOList, DetailsAppAsset.class)); } } return resultCreator.create(ErrorCode.SUCCESS, EntityConverter.convertList(assetDOList, DetailsAppAsset.class)); } @Override public void afterPropertiesSet() throws Exception { ValidAssetByTypeFactory.register(AssetValidateType.REPAIR.getValue(),this); } @Autowired private ResultCreator resultCreator; }
這樣我們就可以在別的地方借用spring的InitializingBean來給別的靜態(tài)數(shù)據(jù)結(jié)構(gòu)塞值,整個過程可以方便我們擴(kuò)展代碼,感覺這種方式寫代碼更符合開閉原則。
到此這篇關(guān)于Spring的InitializingBean接口解析的文章就介紹到這了,更多相關(guān)InitializingBean接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot2.0整合ES5實現(xiàn)文章內(nèi)容搜索實戰(zhàn)
這篇文章主要介紹了Spring Boot2.0整合ES5實現(xiàn)文章內(nèi)容搜索實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01解決SpringCloud Feign傳對象參數(shù)調(diào)用失敗的問題
這篇文章主要介紹了解決SpringCloud Feign傳對象參數(shù)調(diào)用失敗的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06如何用注解的方式實現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id
這篇文章主要介紹了如何用注解的方式實現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07JAVA實現(xiàn)遍歷文件夾下的所有文件(遞歸調(diào)用和非遞歸調(diào)用)
本篇文章主要介紹了JAVA 遍歷文件夾下的所有文件(遞歸調(diào)用和非遞歸調(diào)用) ,具有一定的參考價值,有興趣的可以了解一下。2017-01-01