要使用一个工具去完成诸多的的任务,必须要理解这个工具的原理和核心思想,而spring最重要的工具毫无疑问是依赖注入(DI)和面向切面编程(AOP),web开发中最重要的思想莫过于mvc思想
依赖注入
提到依赖注入,我会想到很多与之有关的词 “面向接口编程”,”策略模式”,”命令模式”等等,这些词其实都围绕着一个中心”解耦合”就像《head first设计模式》里面开篇就提到的那个鸭子一样,红头鸭,塑料鸭,会飞的和不会飞的鸭和他们的行为之间的强耦合会把我们的软件结构弄得一团乱麻,而面向接口的编程方式通过降低耦合毫无疑问会大大改善这种状况
- 两个类相互依赖的状况
public class DuckFly implements FlyBehavior{
public void fly() {
System.out.println("Duck is flying");
}
}
public class DependencyDuck {
//Duck依赖于DuckFly类
public DuckFly flybehavior = new DuckFly();
public void fly() {
flybehavior.fly();
}
}
如上面所示,Duck依赖于DuckFly类,如果有一只不会飞的鸭子,或者飞的和一只小鸡一样,就必须修改duck改变依赖的类,这就是强耦合带来的弊端
策略模式
public interface FlyBehavior { public void fly(); } public class Duck { FlyBehavior flybehavior; public Duck(FlyBehavior flybehavior) { //注入依赖的实例 this.flybehavior = flybehavior; } public void setFlyBehavior(FlyBehavior flybehavior) { //运行时动态注入依赖的实例 this.flybehavior = flybehavior; } public void fly() { flybehavior.fly(); } }
上面的代码中,duck类只持有一个flybehavir的接口,任何实现了这个接口的fly行为都可以在Duck构造,甚至运行时改变鸭子飞行的行为,不管鸭子会不会飞,甚至不是鸭子的飞行方式,都可以在不改变duck类的情况下实现,这就是解耦合的威力,而spring通过注解,配置文件等方式很好的实现了这一点