国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解使用Spring的BeanPostProcessor優(yōu)雅的實(shí)現(xiàn)工廠(chǎng)模式

瀏覽:70日期:2023-08-28 17:45:22

最近學(xué)習(xí)Spring的源碼,發(fā)現(xiàn)一個(gè)利器BeanPostProcessor。這個(gè)后置處理器可以在bean初始化前后對(duì)bean進(jìn)行操作。我們可以在初始化的時(shí)候?qū)ψ约合胍腷ean進(jìn)行緩存,進(jìn)而實(shí)現(xiàn)自己需要處理的邏輯。

背景

當(dāng)我們需要根據(jù)類(lèi)型調(diào)用接口不同實(shí)現(xiàn)的時(shí)候,我們可以使用工廠(chǎng)模式實(shí)現(xiàn)。下面說(shuō)下博主遇到過(guò)的兩次需要使用工廠(chǎng)的場(chǎng)景。

場(chǎng)景一:當(dāng)有一個(gè)模塊,我們需要根據(jù)數(shù)據(jù)庫(kù)的類(lèi)型實(shí)現(xiàn)不同的的sql。我們此時(shí)需要定義一個(gè)接口然后每一種數(shù)據(jù)庫(kù)實(shí)現(xiàn)不同的sql。在調(diào)用時(shí)根據(jù)當(dāng)前的數(shù)據(jù)庫(kù)類(lèi)型調(diào)用對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)。

場(chǎng)景二:我們業(yè)務(wù)需要對(duì)接不同的傳感器設(shè)備,但是總體業(yè)務(wù)邏輯就是獲取數(shù)據(jù),發(fā)送心跳。每一種設(shè)備的數(shù)據(jù)協(xié)議又不一樣。所以需要使用工廠(chǎng),根據(jù)不同的設(shè)備調(diào)用對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)。

工廠(chǎng)模式

靜態(tài)工廠(chǎng)

/** * @Description * @Author Singh * @Date 2020-07-06 21:54 * @Version **/@Servicepublic class HandlerService1 { public <T> void handle(Constant.HandlerType handlerType, T dataDO) { IHandler handler = null; if(handlerType.getType().intValue() == Constant.HandlerType.HANDLE_TYEP_1.getType()){ handler = new Type1Handler(); }else if(handlerType.getType().intValue() == Constant.HandlerType.HANDLE_TYEP_2.getType()){ handler = new Type2Handler(); }else if(handlerType.getType().intValue() == Constant.HandlerType.HANDLE_TYEP_3.getType()){ handler = new Type3Handler(); }else if(handlerType.getType().intValue() == Constant.HandlerType.HANDLE_TYEP_4.getType()){ handler = new Type4Handler(); }else{ throw new RuntimeException('類(lèi)型錯(cuò)誤'); } handler.handle(dataDO); }}

動(dòng)態(tài)工廠(chǎng),通過(guò)class實(shí)現(xiàn)

/** * @Description * @Author Singh * @Date 2020-07-06 21:54 * @Version **/@Servicepublic class HandlerService2 { public <T,H extends IHandler> void handle(Class<H> clzz, T dataDO) throws IllegalAccessException, InstantiationException { IHandler handler = clzz.newInstance(); handler.handle(dataDO); }}

進(jìn)入主題

BeanPostProcessor實(shí)現(xiàn)相同接口的不同實(shí)現(xiàn)bean的工廠(chǎng)

首先定義一個(gè)注解,后續(xù)用來(lái)標(biāo)示bean的處理類(lèi)型

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Handler { @AliasFor(annotation = Component.class) String value() default ''; /** * 業(yè)務(wù)處理類(lèi)型 * @return */ Constant.HandlerType handlerType();}

處理類(lèi)型

/** * @Description * @Author Singh * @Date 2020-07-06 21:25 * @Version **/public class Constant { public enum HandlerType{ HANDLE_TYEP_1(1), HANDLE_TYEP_2(2), HANDLE_TYEP_3(3), HANDLE_TYEP_4(4); private Integer type; HandlerType(Integer type) { this.type = type; } public Integer getType() { return type; } }}

定義接口處理

/** * @Description * @Author Singh * @Date 2020-07-06 21:29 * @Version **/public interface IHandler<T> { void handle(T data);}

BeanPostProcessor實(shí)現(xiàn)對(duì)bean后置處理。通過(guò)注解的類(lèi)型緩存bean對(duì)象。

/** * @Description * @Author Singh * @Date 2020-07-06 21:29 * @Version **/@Servicepublic class HandleService implements BeanPostProcessor { private Map<Integer,IHandler> reportDataHandlerMap = new ConcurrentHashMap<>(); public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if(bean instanceof IHandler){ Handler[] reportHandlers = bean.getClass().getAnnotationsByType(Handler.class); if(reportHandlers == null || reportHandlers.length == 0){return bean; } Handler reportHandler = reportHandlers[0]; reportDataHandlerMap.put(reportHandler.handlerType().getType(), (IHandler) bean); } return bean; } public <T> void handle(Constant.HandlerType handlerType, T dataDO) { IHandler reportDataHandler = reportDataHandlerMap.get(handlerType.getType()); if(reportDataHandler == null){ throw new RuntimeException('類(lèi)型錯(cuò)誤'); } reportDataHandler.handle(dataDO); }}

自定義處理器實(shí)現(xiàn),每一種實(shí)現(xiàn)一次。

/** * @Description * @Author Singh * @Date 2020-07-06 21:32 * @Version **/@Handler(handlerType = Constant.HandlerType.HANDLE_TYEP_1 )public class Type1Handler implements IHandler<String>{ @Override public void handle(String data) { }}

到此這篇關(guān)于詳解使用Spring的BeanPostProcessor優(yōu)雅的實(shí)現(xiàn)工廠(chǎng)模式的文章就介紹到這了,更多相關(guān)Spring BeanPostProcessor 工廠(chǎng)模式內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 亚洲国产日韩在线 | 亚洲欧美日韩精品久久亚洲区 | 91精品啪在线看国产网站 | 国产视频三级 | 99精彩免费观看 | 亚洲国产大片 | 欧美ox| 毛片大全在线观看 | 中文毛片 | 99福利网 | 成人合成mv福利视频网站 | 久久久久久综合对白国产 | 国产成人精品日本亚洲语音1 | 亚洲欧美中文字幕在线网站 | 在线观看免费黄色网址 | 久久久免费视频播放 | 性久久久久久久久久 | 中文字幕在线观看日韩 | 在线精品亚洲 | 成人免费观看一区二区 | 欧洲女同互慰在线视频 | 久久久久久一品道精品免费看 | 中文字幕在线观看国产 | 欧美日韩亚洲精品一区 | 国产欧美在线观看不卡一 | 九色自拍视频 | 欧美亚洲欧美区 | 成人黄色毛片 | 欧美日韩一区二区三区高清不卡 | 欧美一级aa毛片禁片 | 免费国产高清视频 | 欧美国产综合日韩一区二区 | 国产三香港三韩国三级不卡 | 91精品一区二区综合在线 | 精品国产免费一区二区三区 | 美女被爆免费视频软件 | 亚洲国产91| 国产欧美一区二区另类精品 | 黄色大秀视频 | 国产精品久久久 | 欧美视频网站在线观看 |