spring提供了filed的值注入和method的返回值注入。
1、Field值的注入
filed值注入需要使用org.springframework.beans.factory.config.FieldRetrievingFactoryBean来获取类的静态变量。
例如,我们通常在接口中定义常量:
下面利用FieldRetrievingFactoryBean获取CarBandType接口中定义的常量,并注入到某个bean的属性中:
Spring还允许用户用常量的全限定名作为FieldRetrievingFactoryBean的id,其效果和通过配置staticField属性是一样的:
当然,也可以直接将FieldRetrievingFactoryBean以内置bean的方式对brand属性进行赋值,这样在配置上更紧凑一些:
//-------------------------------------------------------------
public interface Person {
public static final int BOSS_LEVEL = 5;
public static final int MANAGE_LEVEL = 2;
public static final int STAFF_LEVEL = 1;
//以下省略
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
<!-- 将person接口中的常量 ,赋值给相应的bean,通过引用可以获取程序中的常量 -->
<
bean
id
=
"BOSS_LEVEL_BEAN"
class
=
"org.springframework.beans.factory.config.FieldRetrievingFactoryBean"
>
<
property
name
=
"staticField"
value
=
"person.member.Person.BOSS_LEVEL"
/>
</
bean
>
<
bean
id
=
"MANAGE_LEVEL_BEAN"
class
=
"org.springframework.beans.factory.config.FieldRetrievingFactoryBean"
>
<
property
name
=
"staticField"
value
=
"person.member.Person.MANAGE_LEVEL"
/>
</
bean
>
<
bean
id
=
"STAFF_LEVEL_BEAN"
class
=
"org.springframework.beans.factory.config.FieldRetrievingFactoryBean"
>
<
property
name
=
"staticField"
value
=
"person.member.Person.STAFF_LEVEL"
/>
</
bean
>
<!-- 第二种方式也可以,感觉速度有点慢 也是通过引用-->
<!--
<bean id="person.member.Person.MANAGE_LEVEL"
class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" />
<bean id="person.member.Person.BOSS_LEVEL"
class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>
<bean id="person.member.Person.STAFF_LEVEL"
class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>
-->
<
bean
id
=
"bossMessage"
class
=
"person.attribute.BaseMessage"
>
<
property
name
=
"userName"
value
=
"老板"
/>
<
property
name
=
"age"
value
=
"30"
/>
</
bean
>
<
bean
id
=
"bossJob"
class
=
"person.attribute.Job"
>
<
property
name
=
"jobName"
value
=
"takeMoney"
/>
<
property
name
=
"salary"
value
=
"20000"
/>
<
property
name
=
"level"
ref
=
"BOSS_LEVEL_BEAN"
></
property
>
</
bean
>
<
bean
id
=
"manageMessage"
class
=
"person.attribute.BaseMessage"
scope
=
"prototype"
>
<
property
name
=
"userName"
value
=
"管理者"
/>
<
property
name
=
"age"
value
=
"25"
/>
</
bean
>
<
bean
id
=
"manageJob"
class
=
"person.attribute.Job"
scope
=
"prototype"
>
<
property
name
=
"jobName"
value
=
"management"
/>
<
property
name
=
"salary"
value
=
"10000"
/>
<
property
name
=
"level"
ref
=
"MANAGE_LEVEL_BEAN"
></
property
>
</
bean
>
<
bean
id
=
"staffMessage"
class
=
"person.attribute.BaseMessage"
>
<
property
name
=
"userName"
value
=
"职员"
/>
<
property
name
=
"age"
value
=
"20"
/>
</
bean
>
<
bean
id
=
"staffJob"
class
=
"person.attribute.Job"
>
<
property
name
=
"jobName"
value
=
"work"
/>
<
property
name
=
"salary"
value
=
"5000"
/>
<
property
name
=
"level"
ref
=
"STAFF_LEVEL_BEAN"
></
property
>
</
bean
>
|
2、Method返回值的注入
Method返回值的注入需要使用MethodInvokingFactoryBean来完成。
在xml配置中,需要设定targetObject和targetMethod来指定目标bean和方法。如果使用静态方法,则需要指定targetClass和targetMethod
配置文件如下:
对于静态方法:
使用静态方法的返回值注入的另一种方式: