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就会根据配置的,找到需要注入的实现类*/
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"?>
"http://www.sprintframework.org/dtd/spring-beans.dtd">
local="stoneAxe"/>
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。