在ssh项目中,是有明确分工的,spring的作用就相当于将struts和hibernate连接起来,是将两个没有关系的框架的特性,方法,action都放在spring的配置文件中使他们建立关系。取他门各自所长。而这些做法他们自己不知道,他们是听命于spring调度的,他的的任务只是做好自己的事情。
下面结合实例理解解容器,DI,IOC,耦合,解耦等Spring所涉及的概念,同时了解Spring的最基本也是最核心的使用方法。
1.
Spring容器负责对象的实例化,对象生命周期的管理,被Spring管理的对象称之为Bean。
例如有Soldier类需要交由Spring容器管理,我们先编写类
package com.hb; public class Soldier { } |
在Spring配置文件中添加如下配置
<</SPAN>bean id="s1" class="com.hb.Soldier"></</SPAN>bean> |
初始化Spring容器
public class Test { ApplicationContext context = new ClassPathXmlApplicationC } |
从Spring容器中取得对象实例
|
Spring默认使用单例的方式创建对象。可以通过修改的配置改变成其它创建方式。这个属性为Scope,称之为作用域或生命周期,它的值为singleton(单例,默认值),prototype(每次产生一个新的实例)等。
|
2.
Setter注入:
Soldier类中有一个属性name,如何在创建Soldier的时候使name的值变为”RANBO”?
配置如下:
<</SPAN>bean <</SPAN>property </</SPAN>bean> |
这样创建的Soldier对象的name属性就有值了,测试代码:
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationC Soldier s1 = (Soldier) context.getBean("s1"); System.out.println(s1.getName()); } |
构造注入:
我们先修改下Soldier类,给它添加一个构造方法:
package com.hb; public class Soldier { } |
配置如下:
<</SPAN>bean <</SPAN>constructor-arg </</SPAN>bean> |
测试结果同上。
3.
当A对象使用了B对象的方法,A对B产生依赖,称之为A依赖B。下面的例子中Soldier类依赖HandGun类。
package com.hb; public class Soldier { } |
package com.hb; public class HandGun { } |
当HandGun发生变化时,必然导致Soldier必须做相应修改,同时,当Soldier需要使用OtherGun时也必须重新编写代码,导致代码重用度不高。
当对象之间的依赖关系很强时(耦合),会使程序代码死板,不利于后期的维护和扩展。降低对象之间的依赖关系称之为解耦。Spring能够很好的解决这一问题。
4.
我们运用Spring的setter注入方式解决HandGun和Soldier的耦合问题。修改Soldier的代码,将HandGun定义为Soldier的属性并提供setter方法:
package com.hb; public class Soldier { } |
配置如下
<</SPAN>bean <</SPAN>property name="handGun"> <</SPAN>ref bean="handgun"></</SPAN>ref> </</SPAN>property> </</SPAN>bean> <</SPAN>bean id="handgun" class="com.hb.HandGun"></</SPAN>bean> |
到这里,我们已经降低了HandGun和Soldier的部分依赖关系,至少在Soldier中不用再自己去实例化HandGun了。然而并没有彻底解决问题,Soldier中仍然可以看到HandGun类,因此我们使用接口进一步改进代码:
package com.hb; public interface Weapon { } |
package com.hb; public class HandGun implements Weapon{ } |
package com.hb; public class Soldier { } |
配置如下
<</SPAN>bean id="s1" class="com.hb.Soldier"> <</SPAN>property name="weapon"> <</SPAN>ref bean="handgun"></</SPAN>ref> </</SPAN>property> </</SPAN>bean> <</SPAN>bean id="handgun" class="com.hb.HandGun"></</SPAN>bean> |
测试:
ApplicationContext context = new ClassPathXmlApplicationC Soldier s1 = (Soldier) context.getBean("s1"); s1.fight(); |
至此,我们使用Spring很好的解决了HandGun和Soldier的耦合问题。Soldier类中再也看不到HandGun的踪影了,Soldier只依赖于接口,而最终Soldier还是使用了HandGun,这是为什么呢?Spring在这里管理了单个的对象,也管理了对象之间即Soldier和HandGun的依赖关系。原本是由Soldier控制HandGun的实例化的,转变为由Spring容器来控制,这里发生了控制权的转移,这就是控制反转(Inversion of Control,简称IOC)。当Soldier需要HandGun时,Spring会自动将HandGun对象注入给Soldier,这就是依赖注入了。
转载地址:http://blog.sina.com.cn/s/blog_6826662b01016mkp.html