一、属性注入
上篇我们简单提到依赖注入的用途。回顾一下所讲内容,发现在object
节点下使用了<
property
name
="Tool"
ref
="computer"
/>
。而property
标签正是用来属性注入的。而ref
是用来标识是关联到哪个object
。而name
属性是指属性名。如下:<
object
id
="modernPerson"
type
="SpringNetIoC.ModernPerson, SpringNetIoC"
>
<
property
name
="Tool"
ref
="computer"
/>
</
object
>
值类型的注入是需要使用property
节点的
value
属性。如
<
property
name
="Name"
value
="Liu Dong"/>
作为内联类型可以使用如下:
<
property
name
="Friend">
<
object
type
="SpringNetDi.Person, SpringNetDi"/>
</
property>
同理,内联类型可以是循环引用的对象(见代码处)。
二、构造函数注入
构造器注入使用
constructor-arg
标签作为标识。同样具有于属性注入相同的方式,使用name、
ref
、
value
作为构造器注入的属性,如下:
<
constructor-arg
name
="argPerson"
ref
="person"/>
<
constructor-arg
name
="intProp"
value
="1"/>
程序的代码如下:
public
class
Person
{
public
string
Name
{
get
;
set
; }
public
int
Age
{
get
;
set
; }
public
Person Friend
{
get
;
set
; }
}
public
class
PersonDao
{
private
Person argPerson;
private
int
intProp;
public
PersonDao(Person argPerson,
int
intProp)
{
this
.argPerson
=
argPerson;
this
.intProp
=
intProp;
}
public
void
Get()
{
//
构造函数注入的整型参数
Console.WriteLine(
string
.Format(
"
intProp:{0}
"
, intProp));
//
构造函数注入的Person
Console.WriteLine(
string
.Format(
"
argPerson Name:{0}
"
, argPerson.Name));
Console.WriteLine(
string
.Format(
"
argPerson Age:{0}
"
, argPerson.Age));
//
内联对象Friend
Console.WriteLine(
string
.Format(
"
argPerson Friend Name:{0}
"
, argPerson.Friend.Name));
Console.WriteLine(
string
.Format(
"
argPerson Friend Age:{0}
"
, argPerson.Friend.Age));
//
内联对象的循环引用
Console.WriteLine(
string
.Format(
"
argPerson Friend Friend Name:{0}
"
, argPerson.Friend.Friend.Name));
Console.WriteLine(
string
.Format(
"
argPerson Friend Friend Age:{0}
"
, argPerson.Friend.Friend.Age));
}
}
<?
xml version="1.0" encoding="utf-8"
?>
<
configuration
>
<
configSections
>
<
sectionGroup
name
="spring"
>
<
section
name
="context"
type
="Spring.Context.Support.ContextHandler, Spring.Core"
/>
<
section
name
="objects"
type
="Spring.Context.Support.DefaultSectionHandler, Spring.Core"
/>
</
sectionGroup
>
</
configSections
>
<
spring
>
<
context
>
<
resource
uri
="config://spring/objects"
/>
</
context
>
<
objects
xmlns
="http://www.springframework.net"
>
<
object
id
="person"
type
="SpringNetDi.Person, SpringNetDi"
>
<!--
属性值类型注入
-->
<
property
name
="Name"
value
="Liu Dong"
/>
<
property
name
="Age"
value
="27"
/>
<!--
内联对象注入
-->
<
property
name
="Friend"
>
<
object
type
="SpringNetDi.Person, SpringNetDi"
>
<
property
name
="Name"
value
="Beggar"
/>
<
property
name
="Age"
value
="23"
/>
<
property
name
="Friend"
ref
="person"
/>
</
object
>
</
property
>
</
object
>
<
object
id
="personDao"
type
="SpringNetDi.PersonDao, SpringNetDi"
>
<!--
构造器注入
-->
<
constructor-arg
name
="argPerson"
ref
="person"
/>
<
constructor-arg
name
="intProp"
value
="1"
/>
</
object
>
</
objects
>
</
spring
>
</
configuration
>
class
Program
{
static
void
Main(
string
[] args)
{
IApplicationContext ctx
=
ContextRegistry.GetContext();
PersonDao dao
=
ctx.GetObject(
"
personDao
"
)
as
PersonDao;
dao.Get();
Console.ReadLine();
}
}
输出效果如下: