如何一步步写出Spring的AOP

6 篇文章 0 订阅
6 篇文章 0 订阅

之前写了一个关于AOP的简单实现,有人留言说太简单了不像Spring的AOP的完善程度高,用起来自己写起来代码有点多。这里我会一步步从0到100写出Spring的AOP,我只会编程语言通用的代码,接口,类,反射来完成例子。涉及的东西越多大家反而越难理解,这里的例子适用于熟悉OOP同学和平台无关。我在这里是想说的AOP不是Spring,为的是让大家都能了解AOP,写出和Spring一样的轻量级框架。

开始最简单的例子,AOP就是切面,先理解Aspect

class Controller{
var m:TestInterface?
var a = Aspect() //切面类
func show(){
a.before() //调用load之前调用方法
m.load()
a.after() //调用load之后调用方法
//Spring的实现就是在某个类调用方法之前和之后插入函数
//切面Aspect,也就是业务流程的封装,隔离解耦不依赖
//大家可以看到,在每个load上边会有写befor 和after
//每个代码都这么写简直就疯掉了,继续进化
}
}
interface TestInterface{
func load()
}
class Model:TestInterface{
func load(){
print(“load”)
}
}
//切面类
class Aspect{
func befor(){
print(“befor”)
}
func after(){
print(“after”)
}
}

再来我们深入一下,把代码中的before和after去掉

//调用
let vc = Model.getVC() //OOP 以对象为主,model动态绑定Controller

class Controller{
var m:TestInterface
func show(){
Proxy().addTarget(ap:Aspect(),m:m)
//代理类完成复杂代码分离
//切面切的不是model,model是一个业务点,不能切。
//切的是controller,动态调用不容mdoel时需要一个切面业务点

}
}
interface TestInterface{
func load()
}

class Model:TestInterface{

static func getVC():Controller{
  let vc = Controller()
  vc = Model()
  retrun vc
}

func load(){
    print("load")
}

}
//代理类 spring 做了动态代理
class Proxy{
var ap:Aspect //切面类
var m:TestInterface
func addTarget(ap:Aspect,m:TestInterface){
self.ap = ap
self.m = m

    test()
}
func test(){
    ap.befor()//函数开始调用
    self.m.load()
    ap.after() //函数最后调用
}

}
//切面类
class Aspect{
func befor(){
print(“befor”)
}
func after(){
print(“after”)
}
}

在Spring中配置xml,通过factory完从调用加载,个人不建议这么使用。代码隐藏的太深了,其他平台和语言不通用。大家可以试试使用反射完成动态代理,从而完成model的befor和after函数隐式调用。还可加加入befor,after调用通知之类的,大家有兴趣可以试试。

实际上AOP带来的更重要的贡献是我们细化了切面理念,之前都是模块开发纵向开发要的是深度和模块分离。AOP说明的开发中共同性提取,把模块打散,每个业务都是独立的,相互组合完成一套业务流程,而不是编写业务流程是组合。这样可玩性就很高了,就可以完成动态业务流程了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值