Spring属性注入实例讲解.docx
- 文档编号:3729458
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:15
- 大小:19.42KB
Spring属性注入实例讲解.docx
《Spring属性注入实例讲解.docx》由会员分享,可在线阅读,更多相关《Spring属性注入实例讲解.docx(15页珍藏版)》请在冰豆网上搜索。
Spring属性注入实例讲解
Spring属性注入2008-12-0319:
18
1、spring的普通属性注入
packagecom.spring;
importjava.util.Date;
importjava.util.List;
importjava.util.Map;
importjava.util.Set;
publicclassBean1{
privateStringstrValue;
privateintintValue;
privateListlistValue;
privateSetsetValue;
privateString[]arrayValue;
privateMapmapValue;
publicStringgetStrValue(){
returnstrValue;
}
publicvoidsetStrValue(StringstrValue){
this.strValue=strValue;
}
publicintgetIntValue(){
returnintValue;
}
publicvoidsetIntValue(intintValue){
this.intValue=intValue;
}
publicListgetListValue(){
returnlistValue;
}
publicvoidsetListValue(ListlistValue){
this.listValue=listValue;
}
publicSetgetSetValue(){
returnsetValue;
}
publicvoidsetSetValue(SetsetValue){
this.setValue=setValue;
}
publicString[]getArrayValue(){
returnarrayValue;
}
publicvoidsetArrayValue(String[]arrayValue){
this.arrayValue=arrayValue;
}
publicMapgetMapValue(){
returnmapValue;
}
publicvoidsetMapValue(MapmapValue){
this.mapValue=mapValue;
}
}
Spring配置文件:
--
-->
2、对象属性的注入
什么是属性编辑器,作用?
*自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入
spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器
如何定义属性编辑器?
*继承PropertyEditorSupport类,覆写setAsText()方法
*将属性编辑器注册到spring中
在上面Bean1中加入Date引用类型的属性及相应的方法
privateDatedateValue;
packagecom.spring;
publicDategetDateValue(){
returndateValue;
}
publicvoidsetDateValue(DatedateValue){
this.dateValue=dateValue;
}
写相应的java.util.Date属性编辑器类
importjava.beans.PropertyEditorSupport;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
/**
*
*@authorAdministrator
*
*/
publicclassUtilDatePropertyEditorextendsPropertyEditorSupport{
privateStringformat="yyyy-MM-dd";
@Override
publicvoidsetAsText(Stringtext)throwsIllegalArgumentException{
System.out.println("UtilDatePropertyEditor.saveAsText()--text="+text);
SimpleDateFormatsdf=newSimpleDateFormat(format);
try{
Dated=sdf.parse(text);
this.setValue(d);
}catch(ParseExceptione){
e.printStackTrace();
}
}
publicvoidsetFormat(Stringformat){
this.format=format;
}
}
在配置文件中加入
--定义属性编辑器-->
3、公共属性的注入
*通过
*具有相同属性的类在
packagecom.spring;
publicclassBean2{
privateBean3bean3;
privateBean4bean4;
privateBean5bean5;
publicBean3getBean3(){
returnbean3;
}
publicvoidsetBean3(Bean3bean3){
this.bean3=bean3;
}
publicBean4getBean4(){
returnbean4;
}
publicvoidsetBean4(Bean4bean4){
this.bean4=bean4;
}
publicBean5getBean5(){
returnbean5;
}
publicvoidsetBean5(Bean5bean5){
this.bean5=bean5;
}
}
packagecom.spring;
publicclassBean3{
privateintid;
privateStringname;
privateStringpassword;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
packagecom.spring;
publicclassBean4{
privateintid;
privateStringname;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
packagecom.spring;
publicclassBean5{
privateintage;
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
}
Spring配置文件:
////////////////////////
Spring的核心机制依赖注入简介
2006-09-3008:
00作者:
出处:
csdn责任编辑:
方舟 设值注入
设值注入是指通过setter方法传入被调用者的实例。
这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。
看下面代码,是Person的接口
//定义Person接口
publicinterfacePerson
{
//Person接口里定义一个使用斧子的方法
publicvoiduseAxe();
}
然后是Axe的接口
//定义Axe接口
publicinterfaceAxe
{
//Axe接口里有个砍的方法
publicvoidchop();
}
Person的实现类
//Chinese实现Person接口
publicclassChineseimplementsPerson
{
//面向Axe接口编程,而不是具体的实现类
privateAxeaxe;
//默认的构造器
publicChinese()
{}
//设值注入所需的setter方法
publicvoidsetAxe(Axeaxe)
{
this.axe=axe;
}
//实现Person接口的useAxe方法
publicvoiduseAxe()
{
System.out.println(axe.chop());
}
}
Axe的第一个实现类
//Axe的第一个实现类StoneAxe
publicclassStoneAxeimplementsAxe
{
//默认构造器
publicStoneAxe()
{}
//实现Axe接口的chop方法
publicStringchop()
{
return"石斧砍柴好慢";
}
}
下面采用Spring的配置文件将Person实例和Axe实例组织在一起。
配置文件如下所示:
<!
--下面是标准的XML文件头-->
<?
xmlversion="1.0"encoding="gb2312"?
>
<!
--下面一行定义Spring的XML配置文件的dtd-->
"http:
//www.springframework.org/dtd/spring-beans.dtd">
<!
--以上三行对所有的Spring配置文件都是相同的-->
<!
--Spring配置文件的根元素-->
<BEANS>
<!
—定义第一bean,该bean的id是chinese,class指定该bean实例的实现类-->
<BEANclass=lee.Chineseid=chinese>
<!
--property元素用来指定需要容器注入的属性,axe属性需要容器注入此处是设值注入,因此Chinese类必须拥有setAxe方法-->
<propertyname="axe">
<!
--此处将另一个bean的引用注入给chinesebean-->
<REFlocal="”stoneAxe”/">
</property>
</BEAN>
<!
--定义stoneAxebean-->
<BEANclass=lee.StoneAxeid=stoneAxe/>
</BEANS>
从配置文件中,可以看到Spring管理bean的灵巧性。
bean与bean之间的依赖关系放在配置文件里组织,而不是写在代码里。
通过配置文件的指定,Spring能精确地为每个bean注入属性。
因此,配置文件里的bean的class元素,不能仅仅是接口,而必须是真正的实现类。
Spring会自动接管每个bean定义里的property元素定义。
Spring会在执行无参数的构造器后、创建默认的bean实例后,调用对应的setter方法为程序注入属性值。
property定义的属性值将不再由该bean来主动创建、管理,而改为被动接收Spring的注入。
每个bean的id属性是该bean的惟一标识,程序通过id属性访问bean,bean与bean的依赖关系也通过id属性完成。
下面看主程序部分:
publicclassBeanTest
{
//主方法,程序的入口
publicstaticvoidmain(String[]args)throwsException
{
//因为是独立的应用程序,显式地实例化Spring的上下文。
ApplicationContextctx=newFileSystemXmlApplicationContext("bean.xml");
//通过Personbean的id来获取bean实例,面向接口编程,因此
//此处强制类型转换为接口类型
Personp=(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编译和运行该应用的简单脚本:
<?
xmlversion="1.0"?
>
<!
--定义编译该项目的基本信息-->
<PROJECTname="spring"default="."basedir=".">
<!
--定义编译和运行该项目时所需的库文件-->
<PATHid=classpath>
<!
--该路径下存放spring.jar和其他第三方类库-->
<FILESETdir=..\..\lib>
<INCLUDEname="*.jar"/>
</FILESET>
<!
--同时还需要引用已经编译过的class文件-->
<PATHELEMENTpath="."/>
</PATH>
<!
--编译全部的java文件-->
<TARGETdescription="Compileallsourcecode"name="compile">
<!
--指定编译后的class文件的存放位置-->
<JAVACdebug="true"destdir=".">
deprecation="false"optimize="false"failonerror="true">
<!
--指定需要编译的源文件的存放位置-->
<SRCpath="."/>
<!
--指定编译这些java文件需要的类库位置-->
<CLASSPATHrefid="classpath"/>
</JAVAC>
</TARGET>
<!
--运行特定的主程序-->
<TARGETdescription="runthemainclass"name="run"depends="compile">
<!
--指定运行的主程序:
lee.BeanTest。
-->
<JAVAfailonerror="true"fork="yes"classname="lee.BeanTest">
<!
--指定运行这些java文件需要的类库位置-->
<CLASSPATHrefid="classpath"/>
</JAVA>
</TARGET>
</PROJECT>
如果需要改写Axe的实现类。
或者说,提供另一个实现类给Person实例使用。
Person接口、Chinese类都无须改变。
只需提供另一个Axe的实现,然后对配置文件进行简单的修改即可。
Axe的另一个实现如下:
//Axe的另一个实现类SteelAxe
publicclassSteelAxeimplementsAxe
{
//默认构造器
publicSteelAxe()
{}
//实现Axe接口的chop方法
publicStringchop()
{
return"钢斧砍柴真快";
}
}
然后,修改原来的Spring配置文件,在其中增加如下一行:
<!
--定义一个steelAxebean-->
<BEANclass=lee.SteelAxeid=steelAxe/>
该行重新定义了一个Axe的实现:
SteelAxe。
然后修改chinesebean的配置,将原来传入stoneAxe的地方改为传入steelAxe。
也就是将
<REFlocal="”stoneAxe”/">
改成
<REFlocal="”steelAxe”/">
此时再次执行程序,将得到如下结果:
钢斧砍柴真快
Person与Axe之间没有任何代码耦合关系,bean与bean之间的依赖关系由Spring管理。
采用setter方法为目标bean注入属性的方式,称为设值注入。
业务对象的更换变得相当简单,对象与对象之间的依赖关系从代码里分离出来,通过配置文件动态管理。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spring 属性 注入 实例 讲解