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

Spring的核心机制依赖注入简介(3)

2007-01-16 14:02 525 查看
Spring会自动接管每个bean定义里的property元素定义。Spring会在执行无参数的构造器后、创建默认的bean实例后,调用对应的setter方法为程序注入属性值。property定义的属性值将不再由该bean来主动创建、管理,而改为被动接收Spring的注入。
  每个bean的id属性是该bean的惟一标识,程序通过id属性访问bean,bean与bean的依赖关系也通过id属性完成。

  下面看主程序部分:




public class BeanTest




...{


 //主方法,程序的入口


 public static void main(String[] args)throws Exception




 ...{


  //因为是独立的应用程序,显式地实例化Spring的上下文。


  ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");


  //通过Person bean的id来获取bean实例,面向接口编程,因此


  //此处强制类型转换为接口类型


  Person p = (Person)ctx.getBean("chinese");


 ?/直接执行Person的userAxe()方法。


  p.useAxe();


 }


}

  程序的执行结果如下:

  石斧砍柴好慢

  主程序调用Person的useAxe()方法时,该方法的方法体内需要使用Axe的实例,但程序里没有任何地方将特定的Person实例和Axe实例耦合在一起。或者说,程序里没有为Person实例传入Axe的实例,Axe实例由Spring在运行期间动态注入。

  Person实例不仅不需要了解Axe实例的具体实现,甚至无须了解Axe的创建过程。程序在运行到需要Axe实例的时候,Spring创建了Axe实例,然后注入给需要Axe实例的调用者。Person实例运行到需要Axe实例的地方,自然就产生了Axe实例,用来供Person实例使用。

  调用者不仅无须关心被调用者的实现过程,连工厂定位都可以省略(真是按需分配啊!)。下面也给出使用Ant编译和运行该应用的简单脚本:


<?xml version="1.0"?>


<!-- 定义编译该项目的基本信息-->


<PROJECT name="spring" default="." basedir=".">


<!-- 定义编译和运行该项目时所需的库文件 -->


<PATH id=classpath>


 <!-- 该路径下存放spring.jar和其他第三方类库 -->


 <FILESET dir=....lib>


  <INCLUDE name="*.jar" />


 </FILESET>


 <!-- 同时还需要引用已经编译过的class文件-->


 <PATHELEMENT path="." />


</PATH>


<!-- 编译全部的java文件-->


<TARGET description="Compile all source code" name="compile">


<!-- 指定编译后的class文件的存放位置 -->


<J***AC debug="true" destdir=".">


 deprecation="false" optimize="false" failonerror="true">


 <!-- 指定需要编译的源文件的存放位置 -->


 <SRC path="." />


 <!-- 指定编译这些java文件需要的类库位置-->


 <CLASSPATH refid="classpath" />


</J***AC>


</TARGET>


<!-- 运行特定的主程序 -->


<TARGET description="run the main class" name="run" depends="compile">


<!-- 指定运行的主程序:lee.BeanTest。-->


<J***A failonerror="true" fork="yes" classname="lee.BeanTest">


 <!-- 指定运行这些java文件需要的类库位置-->


 <CLASSPATH refid="classpath" />


</J***A>


</TARGET>


</PROJECT>

  如果需要改写Axe的实现类。或者说,提供另一个实现类给Person实例使用。Person接口、Chinese类都无须改变。只需提供另一个Axe的实现,然后对配置文件进行简单的修改即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: