可从两方面对IoC进行理解。在IoC模型中,掌握控制权的是容器,由容器控制对象。在传统模型中,对象以及之间的关系通过编码在程序中实现控制。从这方面来看,对象的控制权已经发生了变化。
另外,在IoC模型中,应用程序组件中需要的实例要依赖容器以Bean的形式注入。在传统模型中,应用程序组件中需要的实例需要用new的方式去创建对象。从这方面来看,实例的产生方式已经发生根本的变化。
IoC模型中为什么要发生以上两方面的变化呢?这是因为传统模型中,类与类之间直接调用耦合性强,应用程序之间依赖性高,传统模型是一种入侵式的编程模型。在IoC模型中,则是避免类与类之间的直接调用,最大限度地降低耦合度,提升应用程序之间的独立性。
可以通过分析以下传统模型下的编程方式来加深对这方面的理解。
class A是一个抽象类,class B继承了class A,并实现了其中的抽象方法。在class C中,通过A a=new B()方式创建对象。在hi()方法中,用实例a去调用父类中的hello()方法。大家都知道这是程序中的一种多态,hi()方法运行时会输出“Hello Spring”。当在程序的维护、移植或重用过程中,class B发生了改变,变为class X时,则class C也会受到牵连,其中的代码也需要做相应的改动。因为class B入侵了class C,也可以理解为class C直接调用了class B。(www.xing528.com)
以上是传统模型的编程中程序间耦合性高的一个例子。在IoC模型中,用配置文件(xml)描述类与类之间关系,所有类均在容器中登记,容器管理对象,在程序需要某个对象的时候自动注入所需实例,是一种非入侵式编程方式。
再分析以下IoC模型下的编程方式来加深认识、理解。
class A与class B还是跟上面的一样,在class D中,声明了一个A类型的属性对象a,并且有一个setA(A a)的方法,通过此方法来给上面定义的对象“a”注入实例。在程序运行中需要此实例时,例如运行到hi()方法中的a.hello()语句时,由容器自动调用setA方法注入“a”实例。程序运行完毕,同样可输出“Hello Spring”。即使由于维护、移植、重用的需要,把class B修改为class Y,class D也不需要做任何修改。因为class B没有入侵class D,即class D没有直接调用class B。
这就IoC模型下最简单的编程例子,降低了类与类之间的耦合度,提高了程序间的独立性。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。