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

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

2016-02-23 14:34 411 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: