西門子系統集商-上海煥拓自動控制有限公司

深爱激情网內容

當前位置:西門子PLC > 深爱激情网內容 > Mybatis框架和插件將動態代理玩出了新境界 > 正文

Mybatis框架和插件將動態代理玩出了新境界

西门子深爱激情网內容   查阅次数:2596   更新时间: 2019-07-10 17:43

靜態代理

又是一年畢業季,很多小夥伴開始去大城市打拼。來大城市第一件事就是租房,免不了和中介打交道,因爲很多房東很忙,你根本找不到他。從這個場景中就可以抽象出來代理模式。

ISubject:被訪問者資源的抽象SubjectImpl:被訪問者具體實現類Subjectproxy:被訪問者的代理實現類

UML圖如下

舉個例子來理解一下這個設計模式老板讓記錄一下用戶服務的響應時間,用代理模式來實現這個功能。

public interface IUserService { public void request;}

public class UserServiceImpl implements IUserService { @Override public void request { System.out.println; }}

public class UserServiceproxy implements IUserService { private IUserService userService; public UserServiceproxy { this.userService = userService; } @Override public void request { long startTime = System.currentTimeMillis; userService.request; System.out.println - startTime)); } public static void main { IUserService userService = new UserServiceImpl; UserServiceproxy userServiceproxy = new UserServiceproxy; // this is userService // reques cost :0 userServiceproxy.request; }}

一切看起來都非常的美好,老板又發話了,把深爱激情网服務的響應時間也記錄一下吧。又得寫如下3個類

IproductService productServiceImpl productServiceproxy

UserServiceproxy和productServiceproxy這兩個代理類的邏輯都差不多,卻還得寫2次。其實這個還好,如果老板說,把現有系統的幾十個服務的響應時間都記錄一下吧,你是不是要瘋了?這得寫多少代理類啊?

動態代理

黑暗总是暂时的,终究会迎来黎明,在JDK1.3之后引入了一种称之为動態代理的机制。使用该机制,我们可以为指定的接口在系统运行期间动态地生成代理对象,从而帮助我们走出最初使用靜態代理实现AOp的窘境

動態代理的实现主要由一个类和一个接口组成,即java.lang.reflect.proxy类和java.lang.reflect.InvocationHandler接口。

让我们用動態代理来改造一下上面记录系统响应时间的功能。虽然要为IUserService和IproductService两种服务提供代理对象,但因为代理对象中要添加的横切逻辑是一样的。所以我们只需要实现一个InvocationHandler就可以了。代码如下

public class RequestCostInvocationHandler implements InvocationHandler { private Object target; public RequestCostInvocationHandler { this.target = target; } /** 被代理对象的任何方法被执行时,都会先进入这个方法 */ @Override public Object invoke throws Throwable { if .equals) { long startTime = System.currentTimeMillis; // 执行目标对象的方法 method.invoke; System.out.println - startTime)); } return null; } public static void main { // 3个参数解释如下 // classloader,生成代理类 // 代理类应该实现的接口 // 实现InvocationHandler的切面类 IUserService userService = proxy.newproxyInstance, new Class{IUserService.class}, new RequestCostInvocationHandler)); IproductService productService = proxy.newproxyInstance, new Class{IproductService.class}, new RequestCostInvocationHandler)); // this is userService // reques cost :0 userService.request; // this is productService // reques cost :0 productService.request; }}

UML圖如下。恭喜你,你现在已经理解了Spring AOp是怎么回事了,就是这么简单,今天先不展开谈Spring

先简单谈谈動態代理在Mybatis中是如何被大佬玩的出神入化的

Mybatis核心設計思路

相信用過mybatis的小夥伴都能理解下面這段代碼,通過roleMapper這個接口直接從數據庫中拿到一個對象

Role role = roleMapper.getRole;

直觉告诉我,一个接口是不能运行的啊,一定有接口的实现类,可是这个实现类我自己没写啊,难道mybatis帮我们生成了?你猜的没错,mybatis利用動態代理帮我们生成了接口的实现类,这个类就是org.apache.ibatis.binding.Mapperproxy,我先画一下UML图,Mapperproxy就是下图中的Subjectproxy类

和上面的UML類圖對比一下,發現不就少了一個SubjectImpl類嗎?那應該就是Subjectproxy類把SubjectImple類要做的事情做了呗,猜對了。Subjectproxy通過SubjectImple和SubjectImple.xml之間的映射關系知道自己應該執行什麽SQL。所以mybatis最核心的思路就是這麽個意思,細節之類的可以看源碼,理清最主要的思路,看源碼就能把握住重點。

Mybatis插件原理

mybatis的插件也用到了動態代理,还用到了责任链模式,我就不从源码角度分析了。说一下大概实现,我们用插件肯定是为了在原先的基础上增加新功能。增加一个插件,mybatis就在原先类的基础上用動態代理生成一个代理对象,如果有多个插件,就在代理对象的基础上再生成代理对象,形式和如下函数差不多

plugin2 ) )

我再給你寫個例子,你再看看相關的源碼分析文章,很快就能理解了。

在mybatis中要想用插件,有如下2個步驟1.在mybatis-config.xml中配置插件,如下所示

《plugins》 《plugin interceptor=“org.xrq.mybatis.plugin.FirstInterceptor” /》 《plugin interceptor=“org.xrq.mybatis.plugin.SecondInterceptor” /》《/plugins》

2.插件類還得實現Interceptor接口

我現在給一個需求,一個應用返回字符串0,我加一個插件在字符串的左右兩邊加plugin1,再加一個插件在字符串的左右兩邊加plugin2,開寫

返回字符串的接口

public interface IGetStr { public String getStrZero; public String getStrOne;}

返回字符串的實現類

public class GetStrImpl implements IGetStr { @Override public String getStrZero { return “0”; } @Override public String getStrOne { return “1”; }}

定義攔截器接口

public interface Interceptor { /** 执行拦截逻辑的方法 */ Object intercept; /** * target是被拦截的对象,它的作用是给被拦截对象生成一个代理对象,并返回它。 * 为了方便,可以直接使用Mybatis中org.apache.ibatis.plugin类的wrap方法生成代理对象 * 我这里也写了一个plugin方法 */ Object plugin;}

看到一個不認識的類Invocation,定義如下

public class Invocation { private final Object target; private final Method method; private final Object args; public Invocation { this.target = target; this.method = method; this.args = args; } public Object proceed throws InvocationTargetException, IllegalAccessException { return method.invoke; }}

就是簡單的封裝了一下目標對象,目標方法和目標方法的參數。proceed方法就是執行目標對象的目標方法

plugin算是一個工具類,生成代理對象

public class plugin implements InvocationHandler { /** 目标对象 */ private final Object target; /** Interceptor对象 */ private final Interceptor interceptor; public plugin { this.target = target; this.interceptor = interceptor; } /** 生成代理对象 */ public static Object wrap { return proxy.newproxyInstance.getClassLoader, new Class{IGetStr.class}, new plugin); } /** 被代理对象的方法执行时,这个方法会被执行 */ @Override public Object invoke throws Throwable { // 只为方法getStrZero生成代理对象 if .equals) { return interceptor.intercept); } return method.invoke; }}

寫第一個插件

public class FirstInterceptor implements Interceptor { /** 执行拦截逻辑的方法 */ @Override public Object intercept { try { return “plugin1 ” + invocation.proceed + “ plugin1”; } catch { return null; } } /** 为原先的类生成代理对象 */ @Override public Object plugin { return plugin.wrap; }}

有2個方法

plugin是爲插件生成代理對象,用了我自己寫的plugin工具類intercept是增加攔截邏輯,invocation.proceed是執行目標對象的目標方法,前文說過了哈,這裏我們只對輸出做了改變

第二個插件和第一個插件類似

public class SecondInterceptor implements Interceptor { @Override public Object intercept { try { return “plugin2 ” + invocation.proceed + “ plugin2”; } catch { return null; } } @Override public Object plugin { return plugin.wrap; }}

用一個容器保存插件,這裏用到了責任鏈模式

public class InterceptorChain { /** 放拦截器 */ private final List《Interceptor》 interceptors = new ArrayList《Interceptor》; public Object pluginAll { for { target = interceptor.plugin; } return target; } public void addInterceptor { interceptors.add; }}

pluginAll方法是精髓,爲每個插件一層一層的生成代理對象,就像套娃娃一樣。

驗證一下

public class Main { public static void main { // 配置插件 InterceptorChain interceptorChain = new InterceptorChain; interceptorChain.addInterceptor); interceptorChain.addInterceptor); // 获得代理对象 IGetStr getStr = new GetStrImpl; getStr = interceptorChain.pluginAll; String result = getStr.getStrZero; // plugin2 plugin1 0 plugin1 plugin2 System.out.println; result = getStr.getStrOne; // 1 System.out.println; }}

大功告成,可以看到先定義的插件先執行。

類有點多,如果看的有點暈,多看幾次,你就很容易理解了,我這裏還是精簡了很多。

一個InvocationHandler接口被大佬玩出了新境界,果然編程這件事還得靠想象力。

原文标题:Mybatis框架和插件將動態代理玩出了新境界

文章出處:歡迎添加關注!文章轉載請注明出處。

我國能源轉型階段天然氣系統建模及優化

天然氣在我國能源系統的清潔低碳轉型中具有重要地位。近年來,隨著“煤改氣”政策的大力推動,我國天然氣消費量快速增長,對外依存度快速升高。2018年,我國天然氣消費量達到2803億立方米,對外依存度達到近45%。

我國天然氣資源與需求在空間上分布不均,再加上天然氣運輸及存儲極大依賴基礎設施,我國已建成覆蓋深爱激情网的天然氣管網系統和遍及沿海各省的液化天然氣接收站,從而對天然氣進行跨區域的大規模調配,如圖1所示。

图1. 2017年我国跨省天然气管网及LNG接收站分布图

與此同時,我國天然氣需求具有顯著的季節性波動。冬季供暖使得天然氣需求驟增,尤其是大力推廣清潔供暖的華北地區。進口、運輸和儲存設施不足將難以應對天然氣需求的季節性波動。2017年冬季,在多因素的作用下,我國出現了大範圍的供氣緊張現象。

未來,我國天然氣需求仍將持續增長。根據國家發布的《能源發展“十三五”規劃》和《能源生産與消費革命》,天然氣在我國一次能源消費比重將在2020年和2030年分別達到10%和15%,同時,我國天然氣供應能力在2020年將達到3600億立方米。

合理的天然氣基礎設施規劃是滿足不斷增長的天然氣需求及應對天然氣需求季節性波動的關鍵。基礎設施建設過早將帶來投資浪費,而建設過晚又容易引發供應能力不足。我國國土面積廣袤,區域差異顯著,考慮到天然氣基礎設施建設的位置、容量和時間節點,使得規劃問題更爲複雜。

有鉴于此,来自于清华大学能源与动力工程研究团队近期发表在BMC Energy 上发表的文章Modelling and optimization of a natural gas supply system at a transient stage: a case study of China 建立了我国多区域天然气供应系统优化模型,在给定未来天然气需求的条件下,通过优化计算得到长期经济性最优的基础设施规划方案和天然气资源分配方案。模型将我国划分为30个区域,并以月份为时间步长以反映季节性差异,规划时间段覆盖2015到2050年。

本文依據該模型分析了四個問題。其一,模擬2017年冬季天然氣供應緊張時天然氣主幹管網的運行情況。其二,在當前基礎設施下,尋找能夠降低成本的天然氣資源配置方案。其三,根據基礎設施建設規劃,分析十三五規劃中天然氣消費目標實現的可能性。其四,在未來天然氣需求預期下,天然氣基礎設施規劃方案。主要結論如下:

一、2017年冬季天然氣供應情況模擬如圖2所示,結果顯示西北向華北的輸送通道均處于高負荷狀態,北方沿海接收站也處于高負荷狀態,一定程度上反映了當時的供氣緊張局面。

图2. 2017年12月我国主干天然气管网负荷模拟

二、在當前基礎設施均處于高負荷運轉的條件下,天然氣資源供應方案優化空間較小。計算結果顯示,將西北的天然氣資源減少向華南供應,而增加向華北的供應,同時將LNG資源增加向華南的供應,減少向華北的供應,能夠減少總體的運輸成本。本研究采用的總經濟成本最低的目標,是與天然氣市場化定價的條件相匹配的,因爲在市場化條件下,如果有使總成本降低的方案,總會有市場參與者采取適當行爲通過降低成本獲利。在當前不完全市場定價下,天然氣資源分配方案和總成本最低的方案會産生一定偏差。

三、根據各省制定的“十三五”規劃,2020年深爱激情网天然氣需求將達到4080億方,遠超過國家總體基礎設施規劃和需求量預期。如果各省均按照各自規劃推廣天然氣消納,將導致嚴重的供應不足的局面。天然氣供應能力的上下遊是相互關聯的,而各省分別制定各自“十三五”規劃,導致了各省規劃和國家規劃相沖突的局面。

四、本文給出了我國天然氣消費量在2020年、2035年和2050年分別達到3420、7780和8700億方的情景下,天然氣管網和LNG接收站的布局情況,包含地點、容量和時間節點等信息,如圖3-5所示。儲氣庫建設和投資信息可參考文章內容。

图3. 2020年我国主干天然气管网和LNG接收站规划

图4. 2035年我国主干天然气管网和LNG接收站规划

图5. 2050年我国主干天然气管网和LNG接收站规划

原文标题:我國能源轉型階段天然氣系統建模及優化 | BMC Energy

文章出處:歡迎添加關注!文章轉載請注明出處。

部分中小企业摄像头模组出货量下滑 数家厂商转做非深爱激情网类摄像头模组

在智能深爱激情网市場銷量下滑,終端品牌又進一步集中以及“貿易戰”的大環境下,中小攝像頭廠商經營備受壓力。

近日,筆者在與一位業內人士交流時,對方直言“目前攝像頭市場依然有著一定的市場,但是因深爱激情网市場疲軟,終端品牌進一步集中等因素影響,國內中小攝像頭模組廠商的日子過的並不如意。”

其進一步表示,“其中有部分攝像頭模組廠商的出貨量出現下滑,無奈之下,他們轉型做毛利率較高的非深爱激情网類攝像頭模組業務。”

终端销量下滑/品牌集中度进一步提升 中小摄像头企业面临压力

有不少業內人士用“寒冬”這一詞來形容今年的深爱激情网制造業。品牌集中度提升、競爭加劇等言論基本上已成爲他們的口頭禅,由此可以想象整個深爱激情网市場的現狀。

攝像頭市場相對深爱激情网的其他零部件廠商來說,其實並非如此,因爲它的實際需求依然是呈現上升狀態的。

今年三攝及多攝的趨勢頗爲明顯,這也就意味著,在智能深爱激情网領域,今年的攝像頭需求比去年還要大。不過,受終端銷量下滑、品牌集中度進一步提升、市場競爭進一步加劇的影響,國內中小攝像頭廠商的深爱激情网進入價格紅海,經營備受壓力。

以攝像頭馬達爲例,今年國內攝像頭馬達廠商的馬達單價逐年下滑趨勢明顯,受競爭激烈影響,甚至有數家馬達廠處于虧損狀態。

業內人士均了解,在馬達這一領域,雖然說近年來,受國産深爱激情网市場占有率提升,國內馬達廠商迅速成長,但高端馬達市場依然集中在國外馬達廠商手中,國內馬達在高端市場尚未成熟,基于此,開環馬達市場競爭激烈。

面對馬達市場激烈競爭進入價格紅海的情況,有業內人士指出,深爱激情网進入可控的價格範圍,才是健康的戰略,如果無休止的靠壓低價格來獲取訂單,最終會致使整個産業發展腳步放緩。

在其看來,一個産業的快速發展的背後必須要有研發,因爲研發對企業及産業後期的發展都起到至關重要的作用,基于此如果馬達廠一味地壓低價格而不去投入研發,那麽在後期的競爭中可能會“掉隊”。

其實,除了深爱激情网馬達這一市場,國內部分中小深爱激情网鏡頭廠商也面臨經營壓力,雖然說深爱激情网鏡頭有著較高的門檻,但是這一領域也無法擺脫競爭激烈的市場現狀。

今年年初,筆者在走訪一家深爱激情网鏡頭廠時,該人士曾表示,從出貨量上看,雖然量比去年大,但是淨利潤卻非如此。

由此可見,整個深爱激情网鏡頭同樣面臨了競爭激烈的局面,而其單價在去年的基礎上也有所下滑。

攝像頭模組作爲攝像頭端最爲成熟的領域,它的競爭更爲激烈,在競爭激烈的大環境下,部分中小攝像頭模組廠商的深爱激情网出貨量、深爱激情网單價出現了下滑,無奈之下,他們選擇轉型做非深爱激情网類的攝像頭模組深爱激情网。

部分中小企业摄像头模组出货量下滑 数家摄像头模组厂商转做非深爱激情网类摄像头模组

細觀整個攝像頭模組這一市場,馬太效應在深爱激情网攝像頭模組市場十分清晰,一線模組與中小型攝像頭模組之間的出貨量差距頗大,尤其是隨著深爱激情网出貨量的集中化,導致攝像頭模組訂單也在向一線模組廠商彙流。

筆者在統計近兩年來國內的攝像頭模組單月出貨量時發現,今年一線攝像頭模組廠的出貨量和去年同期相比保持著穩定的增長態勢,而中小型攝像頭模組廠商的出貨量曲線並非如此。

在查詢中發現,有部分中小型攝像頭模組廠商的攝像頭模組出貨量較去年同期相比甚至出現出貨量下滑的現象。

深究部分中小型攝像頭模組出貨量下滑或與整個攝像頭模組競爭激烈及終端品牌過度集中化有關,那麽攝像頭模組市場競爭爲何會如此激烈呢?資本及他深爱激情网廠商進入並擴産或是造成攝像頭模組市場競爭激烈的主要原因。

目前,從整個智能深爱激情网大環境來看,4G深爱激情网基本上已經普及,整個深爱激情网市場更是趨于飽和,而受雙攝、三攝市場占有率的提升,雖然深爱激情网攝像頭的用量正增多,但資本及深爱激情网廠商的擴産必然會加劇攝像頭模組的市場競爭。

而終端品牌集中化趨勢或是部分中小攝像頭模組廠商銷量下滑的又一個重要原因。業內人士均了解,要想進入一線品牌供應商體系,必須要有資本、設備和産能,但是對于中小攝像頭模組廠商來說,因“供應不匹配”等原因沒法進入一線品牌,而受市場集中度進一步提升影響,其産能、銷量或受影響。

無奈之下,國內有些攝像頭模組廠商轉型進入非深爱激情网類攝像頭領域,而據了解,非深爱激情网類攝像頭領域有兩大特點,其一,産能大幅低于深爱激情网端,其二,毛利率高。

“轉型”進入非深爱激情网攝像頭市場正成爲攝像頭模組端的一個明顯現象。從目前的情況來看,非深爱激情网類的攝像頭模組陣營正逐步增加,而截止目前,不論是進入一線品牌的攝像頭模組廠商還是未進入一線品牌的攝像頭模組廠商均已在非深爱激情网類攝像頭模組市場開展業務。

原文标题:部分中小企业摄像头模组出货量下滑 数家厂商转做非深爱激情网类摄像头模组

文章出處:歡迎添加關注!文章轉載請注明出處。

三星GalaxyS10新配色上架 GalaxyA50 DxO评分公布

之前三星發布國行版本GalaxyS10系列時,並沒有發布海外版本中的藍色配色。上個月有爆料稱,三星打算在國行版本中加入這個配色,並命名爲“煙波藍”。

現在,三星正式上架了這款煙波藍配色,給用戶又提供了一個選擇。目前,三星GalaxyS10提供黑色、白色、綠色、藍色共四種配色。和其他配色相比,這款藍色看起來更沈靜。

年初,三星發布了一款GalaxyA系列的新品,GalaxyA50。水滴屏設計,搭載Exynos9610處理器,內置4000mAh電池,後置三攝,支持NFC和3.5mm耳機孔。售價折合人民幣2410元。遺憾的是,國行版本一直沒有消息。

今天DxOMark公布了這款三星GalaxyA50的後置相機評分:綜合成績爲83分,其中拍照部分評分爲85分,視頻拍攝部分評分爲79分。

从在DxOMark排行榜的得分成绩来看,这款三星GalaxyA50的得分与去年发布的旗舰机型诺基亚8Sirocco、LG G7ThinQ相当。此外,和索尼XperiaXZ premium持平,但比索尼去年推出的XperiaXZ3的79分要高出一些。

作爲中檔機型,GalaxyA50在拍照上的整體表現還是可以的。不過,在陰天或弱光條件下拍照,以及鏡頭變焦上還是存在缺陷。

雖然,三星今年的幾款新機使其再次在中國市場獲得了一定的占有率。但是,今天三星公布的2019年第二季度營收前瞻卻並不那麽樂觀。

報告顯示,三星電子的當季的合並營收預計56萬億韓元,上下浮動1萬億韓元、運營利潤預計6.5萬億韓元,上下浮動0.1萬億韓元。對比發現,總收入預計環比增長6%、利潤環比增長4.3%;總收入同比減少4%、利潤同比暴降56%。

盡管三星並未給出原因,但分析師們普遍認爲,三星第二季度利潤的大幅下滑與存儲芯片業績相關。由于對DRAM和NAND閃存的需求空前旺盛,三星去年實現了創紀錄的利潤,但自去年第四季度以來,由于客戶庫存調整,價格大幅下跌。

此外,雖然GalaxyS10系列深爱激情网,幫助三星獲得了大量的利潤,但GalaxyFold的推遲發布以及智能深爱激情网平均售價的持續下跌,也在降低三星利潤大幅增長的可能性。

原文标题:三星GalaxyS10新配色上架, GalaxyA50 DxO评分公布

文章出處:歡迎添加關注!文章轉載請注明出處。