求学者

骑士传奇(上)--Spring的IOC和AOP

这是一个非常老套的骑士冒险故事

骑士出世

伟大的人物出生时,都会伴随天地异象,我们的骑士也不例外,骑士出生时,天地间代码纷飞。

1
2
3
4
5
6
7
8
9
10
package com.knightlegend.spring;
public class Knight {
//骑士出生就是为了营救公主
private RescueMission RescueMission;
public Knight() {
//紧耦合
this.RescueMission = new RescueMission();
}
}

1
2
3
4
package com.knightlegend.spring;
public class RescueMission {
}

好的,就这样我们的白板骑士号就创建好了。

新手任务

王国的公主被恶龙抓走了,我们骑士的使命来临了,就在骑士准备出发营救公主之际,邻居家大妈的鸡丢了,拜托我们的骑士帮她找回她丢失的母鸡,这,这简直是so easy,骑士满口答应下来,打开自己的技能面板…

紧急修复…

1
2
3
4
5
package com.knightlegend.spring;
public class CatchChicks {
// 技能 捉小鸡...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.knightlegend.spring;
//骑士面板
public class Knight {
//骑士出生就是为了营救公主
private RescueMission RescueMission;
// 紧急修复,添加捉小鸡技能
private CatchChicks catchChicks;
public Knight() {
//紧耦合
this.RescueMission = new RescueMission();
this.catchChicks = new CatchChicks();
}
}

修复完成…(以后不能让骑士去接这种掉身价任务了)

哈哈,我们的骑士果然是无所不能的,天生自带捉小鸡技能…
使用技能捉小鸡…
捕获邻居家母鸡一只…(不要在意这些细节)
bingo,任务完成…

新手任务二

隔壁的老奶奶缓缓的走向骑士,我家的小孙子一天都没回来了,你能帮我找找看吗?
这个,这个..

紧急修复,紧急修复…
骑士天赋技能升级

1
2
3
4
5
6
package com.knightlegend.spring;
public interface Quest {
// 骑士天赋:搞事情
// 效果:心想事成
}

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.knightlegend.spring;
//骑士面板
public class Knight {
//我们的骑士是个挂比
private Quest quest;
public Knight(Quest quest) {
//quest 被注入进来,构造器注入
this.quest = quest;
//Quest 搞事情接口,骑士不与具体事情的实现 发生耦合,
//只实现搞事情接口,这就是依赖注入(DI)的最大收益:松耦合
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.knightlegend.spring;
//骑士技能
public class FindGrandchildren implements Quest{
//骑士技能三:找小孙子
}
package com.knightlegend.spring;
//骑士技能
public class CatchChicks implements Quest{
// 骑士技能二:捉小鸡...
}
package com.knightlegend.spring;
//骑士技能
public class RescueMission implements Quest{
//骑士技能一:救公主
//...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<bean id="knight" class="com.knightlegend.spring.Knight">
<constructor-arg ref="quest"/>
</bean>
<!-- 将救公主技能装配给骑士 -->
<bean id="quest" class="com.knightlegend.spring.RescueMission">
</bean>
<!--... 略-->
</beans>

修复说明:通过构造器注入,将搞事情接口注入进入骑士面板,实现了骑士面板与技能的松耦合,这样骑士每次接受到新的任务时,就不用修改骑士面板代码,只需新增相对应的任务技能,装配给骑士即可。
这就是 Spring 的 IOC(Inversion of Control-IOC),控制反转,通过依赖注入(DI)实现,容器负责创建对象和维护对象之间的依赖关系,帮助应用对象之间保持松散耦合。
可与之前实现方法作对比。

bingo,修复完成(以后任何任务来了都不怕啦)
使用技能找孙子…
成功找到隔壁老奶奶孙子…
任务完成。

新的征程

终于完成了新手任务,我们的骑士也将踏上新的征程

那就下期再会吧!