javaEE开发中,现在最成熟的框架之一应该就是spring了,spring框架最强大的地方就是实现了依赖注入(也叫控制反转),最近的一个项目中用的就是spring框架,spring框架是工厂模式的应用结合了MVC的设计思想,,大家可以看到在spring框架中到处体现工厂模式,下面是一个简单的例子, 依赖注入早期叫控制反转,也可以称反射,他们的意义都相同。当某个 Java 实例(调用者)需要另一个Java 实例(被调用者)时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。而在依赖注入的模式下,创建被调用者的工作(也就是实例化一个类)不再由调用者来完成,通常由 Spring 容器来完成,然后注入调用者,因此称为控制反转,也称为依赖注入。 1、建立接口:人与斧头 人,定义一个动作: package test2; public interface Person { public void useAxe(); } 斧头,定义一个动作: package test2; public interface Axe { public void chop(); } 2、建立接口的实现类:中国人与石斧 中国人 package test2; public class Chinese implements Person{ /*默认无参构造方法不管为私的还是公有的,都可以访问,并且要保证bean中存在可以被外界访问的无参构造函数*/ private Chinese(){}; /*定义需要被使用的斧头接口,具体使用什么斧头这里不管*/ private Axe axe; /*定义被注入斧头的set方法,该方法一定要符合JAVABEAN的标准。在运行时候, *Sping就会根据配置的<ref local=""/>,找到需要注入的实现类*/ public void setAxe(Axe axe){ this.axe=axe; } /*这个时候使用的axe,就不再是接口Axe本身,而是被注入的子类实例,所以这里的chop()动作就是具体子类的chop动作*/ public void useAxe() { axe.chop(); } } 石斧 package test2; public class StoneAxe implements Axe { public void chop() { System.out.println("石斧慢慢砍"); } } 3、建立映射配置文件bean.xml: <?xml version="1.0" encoding="gb2312"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www./dtd/spring-beans.dtd"> <beans> <bean id="chinese" class="test2.Chinese"> <!-- 声明实现类test2.Chinese中的属性 --> <property name="axe"> <!-- 指定其中声明的属性,需要用本地的那个id对应的class 这里local的值为"stoneAxe",表示axe的属性值在注入的时候, 将会用test2.StoneAxe实例注入,到时在实例类Chinese中使用 axe的时候,实际上调用的时候StoneAxe的实例 --> <ref local="stoneAxe"/> </property> </bean> <bean id="stoneAxe" class="test2.StoneAxe"/> </beans> 4、测试用例: package test2; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class Caller { public static void main(String[] args) { Caller caller=new Caller(); caller.doIt(); } public void doIt(){ String bean=getClass().getResource("bean.xml").toString(); ApplicationContext ctx=new FileSystemXmlApplicationContext(bean); Person person=(Person)ctx.getBean("chinese"); person.useAxe(); } } 为什么说在客户端调用某一个类的时候不需要实例化这个类呢?因为在客户端先声明了这个类的接口,然后给这个接口一个public的set方法,这样就相当于实例化了一个实现了这个接口的类,看起来不可思议,实际上很简单,在spring的配置文件中声明这个客户端调用了哪个类,然后spring的ioc容器完成注入工作,spring框架说的这么牛,实际上做的事情很少,估计更大的贡献是提出了依赖注入这理念,一个类如果要调用其它的类,就必须实例化这个类(除非你在这个类里写static方法),传统的做法必须这样,这样的话两个类之间建立了很强的耦合,而面向对象就是为了降低程序之间的耦合,达到可重用的目的,spring框架就是为了降低耦合而诞生的,用实例化接口来代替实例化实现了这一接口的类,然后在spring的配置文件中声明这个接口和类的关心,就可以在客户端调用这个实现类的方法了 敲了半天不知道有没有说清楚,spring最简单的思想就是这样的,说起来简单,在大项目里面spring框架的用处已经到了不可忽略的地步了,相比EJB这种侵入性的重量级框架,spring更加精悍,也更加灵活,和struts1.0相比,spring的设计思路更单一,但是spring在view这一层的表现力远不如struts,因为struts有强大的标签库,struts2.0规范了设计的思路,也很强大,至于hibernate在模型层的作用无可代替,另外hibernate是现在研究最多的框架技术,应该说还在发展阶段,现在最新的而版本是hibernate3.2 |
|