看到标题大家很疑惑,spring框架是java服务端的框架,为什么会在移动端?
首先强调一点spring确实是java服务端的的轻量框架,spring非常优秀。他的设计理念在我看过之后被深深折服,完善成熟的 DI/IOC 和 AOP让我着迷。了解之后发现VueKotlin和他有着异曲同工之妙,该有人说我攀高枝了,但是我深入分析之后发现这两个框架竟然在设计上是一样的,我之前没有接触过服务端的东西。
先放上demo代码:https://github.com/wangyongyue/VueKotlinDemo.git
还是先放上spring的说明,VueKotlin的说明要不要改改啊
Spring框架是Java应用最广的框架,他的成功来源于理念,而不是技术本生,他的理念报告IOC(控制反转),AOP(面向切片编程)。
Spring 是一个轻量级的DI/IOC 和 AOP容器的开源框架,侵入最少。
VueKotlin 大言不惭的说是移动框架的Spring,到底哪里来的勇气和自信,让我们来对比看看:
1,IOC 控制反转,顾明思议,以前这么写的代码,我们反过来写,就是控制反转了。
以MVC的一小段代码来说明一下:
正转的代码:
var intent = Intent()
intent.setClass(this,HomeActivity::class.java)
startActivity(intent)
反转的代码:
var intent = Intent()
intent.putExtra("className",Home.toString())
intent.setClass(this,Home.getActivity())
startActivity(intent)
正传的代码就是通过Activity来标定业务流程,Activity是唯一的主角,无论什么模式,最后都有回到Activity里面去实例化,完成数据加载和view渲染。
反转概念就是完全的以数据(data/http)为业主流程,Activity跌下宝座,变成了一个容器(容器这个概念要记住),有数据来决定需要什么样的容器,代码如下
在Model里面:
class Home:HomeInterface{
companion object{
fun getActivity(): Class<Any>{
return HomeActivity::class.java as Class<Any>
}
}
fun loadData(){ //实现了HomeInterface的方法
//加载数据
}
}
在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()
}
}
//协议
interface HomeInterface{
fun loadData()
}
这里大家可以看到了VueKotlin的优势,Activity可以完成复用和解耦了。Activity中动态加载Model类完成业务需求。有人说了不对,在Spring中实现反转是通过反射完成动态实例化的。对的,Kotlin中可以用反射完成动态加载,但是有简便的方法当然就用简便的啦,反射是有代价的
很多人注意到了HomeInterface,这是怎么回事?
这个就引出下一个核心了AOP,面向切片编程,很多人都有写,我在这贴一下百度百科的定义
2,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
不要管定义,看一眼就好,看一天不明白还是不明白啊。
AOP有两种实现方案一种接口实现,就是上边这种的;一种是子类实现;
总结就是多态,开始我也是子类实现,但是当需要增加一个接口时,需要在用到的地方都去改,容易漏,但是接口实现要加需求,没改的地方会有警告,这个超级好。所以放弃子类实现,改成接口实现。
interface目的就是规定容器(Acitvity/fragment)对外部的接口协议,想要使用容器(Acitvity/fragment)就是实现他的协议接口就可以了。
但是数据是怎样流动的呢?Acitvity里面有一个TextView,Model请求数据之后如何回传呢?
对,通知observer,异步请求完数据通知回传,VueKotlin是如何完成的呢?
先看例子:
在Model里面:
class Home:HomeInterface{
var textVue:Vue = Vue()
companion object{
fun getActivity(): Class<Any>{
return HomeActivity::class.java as Class<Any>
}
}
fun loadData(){ //实现了HomeProtocol的方法
//加载数据
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()
}
}
//协议
Protocol HomeProtocol{
var textVue:Vue
fun loadData()
}
当大家在看到var textVue:Vue = Vue()这行代码很懵,不要慌我来解释一下。
Vue (著名的前端框架VUE),没错你没看错,就是他,你这个大帅哥。
Vue类在VueKotlin的核心类,为什么取这个名字呢。之前也不叫这个,叫CatFlow。但是我使用的API命名是借鉴的Vue来写的,写了一大半的时候感觉用人家的东西应该告诉一声的,最后想想就用了VueKotlin的名字了。有认识尤大神的可以推荐一下下啊
Vue类就实现数据回传的,相当是view找了一个代理人,你帮我看这个去,干完了告诉我。最好是一个Vue只做一件事情,也可以做多件但是不建议。
至此,VueKotlin 和Spring的理念契合完毕,完美如你。
想到一句老话,编程,重要的是思想。