您的位置:首页 > 编程语言 > Java开发

一个简单的例子说明java中spring框架的依赖注入

2012-03-02 15:53 453 查看
Struts

ActionServlet-----前端控制器,负责拦截客户的请求信息,读取struts-config.xml中的配置,创建或者读取相应的actionform,调用ActionForm 的reset()方法,把值设到ActionFrom中,如果验证出错,转到input页面没错的话将请求任务分派到Action;Action------各业务逻辑的控制器,调用业务模型进行业务逻辑处理,如果actionerror 中不为空跳转到input页面,为空的话返回ActionForward对象;ActionForward------包含页面跳转信息;ActionForm------负责页面数据收集工作.

一个简单的例子说明java中spring框架的依赖注入

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.sprintframework.org/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

来自: http://hi.baidu.com/winsky027/blog/item/af7a45ae3e9e07c57cd92aff.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: