看到標(biāo)題大家很疑惑础爬,spring框架是java服務(wù)端的框架,為什么會(huì)在移動(dòng)端?
首先強(qiáng)調(diào)一點(diǎn)spring確實(shí)是java服務(wù)端的的輕量框架,spring非常優(yōu)秀蛀醉。他的設(shè)計(jì)理念在我看過之后被深深折服,完善成熟的 DI/IOC 和 AOP讓我著迷钾怔。了解之后發(fā)現(xiàn)VueKotlin和他有著異曲同工之妙,該有人說我攀高枝了显歧,但是我深入分析之后發(fā)現(xiàn)這兩個(gè)框架竟然在設(shè)計(jì)上是一樣的,我之前沒有接觸過服務(wù)端的東西确镊。
先放上demo代碼:https://github.com/wangyongyue/VueKotlinDemo.git
還是先放上spring的說明士骤,VueKotlin的說明要不要改改啊
Spring框架是Java應(yīng)用最廣的框架,他的成功來源于理念蕾域,而不是技術(shù)本生拷肌,他的理念報(bào)告IOC(控制反轉(zhuǎn)),AOP(面向切片編程)旨巷。
Spring 是一個(gè)輕量級(jí)的DI/IOC 和 AOP容器的開源框架巨缘,侵入最少。
VueKotlin 大言不慚的說是移動(dòng)框架的Spring,到底哪里來的勇氣和自信采呐,讓我們來對(duì)比看看:
1若锁,IOC 控制反轉(zhuǎn),顧明思議斧吐,以前這么寫的代碼拴清,我們反過來寫,就是控制反轉(zhuǎn)了会通。
以MVC的一小段代碼來說明一下:
正轉(zhuǎn)的代碼:
var intent = Intent()
intent.setClass(this,HomeActivity::class.java)
startActivity(intent)
反轉(zhuǎn)的代碼:
var intent = Intent()
intent.putExtra("className",Home.toString())
intent.setClass(this,Home.getActivity())
startActivity(intent)
正傳的代碼就是通過Activity來標(biāo)定業(yè)務(wù)流程口予,Activity是唯一的主角,無論什么模式涕侈,最后都有回到Activity里面去實(shí)例化沪停,完成數(shù)據(jù)加載和view渲染。
反轉(zhuǎn)概念就是完全的以數(shù)據(jù)(data/http)為業(yè)主流程裳涛,Activity跌下寶座木张,變成了一個(gè)容器(容器這個(gè)概念要記住),有數(shù)據(jù)來決定需要什么樣的容器端三,代碼如下
在Model里面:
class Home:HomeInterface{
companion object{
fun getActivity(): Class<Any>{
return HomeActivity::class.java as Class<Any>
}
}
fun loadData(){ //實(shí)現(xiàn)了HomeInterface的方法
//加載數(shù)據(jù)
}
}
在HomeVC里面的代碼:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val m = Class.forName(this.className).getConstructor().newInstance() as HomeInterface
m.loadData()
}
}
//協(xié)議
interface HomeInterface{
fun loadData()
}
這里大家可以看到了VueKotlin的優(yōu)勢(shì)舷礼,Activity可以完成復(fù)用和解耦了。Activity中動(dòng)態(tài)加載Model類完成業(yè)務(wù)需求郊闯。有人說了不對(duì)妻献,在Spring中實(shí)現(xiàn)反轉(zhuǎn)是通過反射完成動(dòng)態(tài)實(shí)例化的。對(duì)的团赁,Kotlin中可以用反射完成動(dòng)態(tài)加載育拨,但是有簡(jiǎn)便的方法當(dāng)然就用簡(jiǎn)便的啦,反射是有代價(jià)的
很多人注意到了HomeInterface欢摄,這是怎么回事熬丧?
這個(gè)就引出下一個(gè)核心了AOP,面向切片編程,很多人都有寫怀挠,我在這貼一下百度百科的定義
2析蝴,AOP為Aspect Oriented Programming的縮寫害捕,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)闷畸。
不要管定義尝盼,看一眼就好,看一天不明白還是不明白啊腾啥。
AOP有兩種實(shí)現(xiàn)方案一種接口實(shí)現(xiàn),就是上邊這種的冯吓;一種是子類實(shí)現(xiàn);
總結(jié)就是多態(tài)倘待,開始我也是子類實(shí)現(xiàn),但是當(dāng)需要增加一個(gè)接口時(shí)组贺,需要在用到的地方都去改凸舵,容易漏,但是接口實(shí)現(xiàn)要加需求失尖,沒改的地方會(huì)有警告啊奄,這個(gè)超級(jí)好。所以放棄子類實(shí)現(xiàn)掀潮,改成接口實(shí)現(xiàn)菇夸。
interface目的就是規(guī)定容器(Acitvity/fragment)對(duì)外部的接口協(xié)議,想要使用容器(Acitvity/fragment)就是實(shí)現(xiàn)他的協(xié)議接口就可以了仪吧。
但是數(shù)據(jù)是怎樣流動(dòng)的呢庄新?Acitvity里面有一個(gè)TextView,Model請(qǐng)求數(shù)據(jù)之后如何回傳呢薯鼠?
對(duì)择诈,通知observer,異步請(qǐng)求完數(shù)據(jù)通知回傳,VueKotlin是如何完成的呢出皇?
先看例子:
在Model里面:
class Home:HomeInterface{
var textVue:Vue = Vue()
companion object{
fun getActivity(): Class<Any>{
return HomeActivity::class.java as Class<Any>
}
}
fun loadData(){ //實(shí)現(xiàn)了HomeProtocol的方法
//加載數(shù)據(jù)
textVue.v_text {
return "wangyongyue"
}
}
}
在HomeActivity里面的代碼:
class HomeActivity: AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val m = Class.forName(this.className).getConstructor().newInstance() as HomeInterface
m.loadData()
}
}
//協(xié)議
Protocol HomeProtocol{
var textVue:Vue
fun loadData()
}
當(dāng)大家在看到var textVue:Vue = Vue()這行代碼很懵羞芍,不要慌我來解釋一下。
Vue (著名的前端框架VUE),沒錯(cuò)你沒看錯(cuò)郊艘,就是他荷科,你這個(gè)大帥哥。
Vue類在VueKotlin的核心類纱注,為什么取這個(gè)名字呢步做。之前也不叫這個(gè),叫CatFlow奈附。但是我使用的API命名是借鑒的Vue來寫的全度,寫了一大半的時(shí)候感覺用人家的東西應(yīng)該告訴一聲的,最后想想就用了VueKotlin的名字了斥滤。有認(rèn)識(shí)尤大神的可以推薦一下下啊
Vue類就實(shí)現(xiàn)數(shù)據(jù)回傳的将鸵,相當(dāng)是view找了一個(gè)代理人勉盅,你幫我看這個(gè)去,干完了告訴我顶掉。最好是一個(gè)Vue只做一件事情草娜,也可以做多件但是不建議。
至此痒筒,VueKotlin 和Spring的理念契合完畢宰闰,完美如你。
想到一句老話簿透,編程移袍,重要的是思想。