1. 程式人生 > >Spring為屬性注入某個類的常量或方法的返回值

Spring為屬性注入某個類的常量或方法的返回值

spring提供了filed的值注入和method的返回值注入。

1、Field值的注入

filed值注入需要使用org.springframework.beans.factory.config.FieldRetrievingFactoryBean來獲取類的靜態變數。

例如,我們通常在介面中定義常量:

[java] view plaincopyprint?
  1. package com.baobaotao.fb; 
  2. publicinterface CarBrandType { 
  3.     String HONG_QI = "紅旗"
  4.     String JI_LI = "吉利"

下面利用FieldRetrievingFactoryBean獲取CarBandType介面中定義的常量,並注入到某個bean的屬性中:

[xhtml] view plaincopyprint?
  1. <beanid="car"class="com.baobaotao.fb.Car">
  2.     <propertyname="brand"ref="hongQi"
    />
  3. </bean>
  4. <bean id="hongQi"class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"
  5.     <propertyname="staticField"value="com.baobaotao.fb.CarBrandType.HONG_QI"/>
  6. </bean>

Spring還允許使用者用常量的全限定名作為FieldRetrievingFactoryBean的id,其效果和通過配置staticField屬性是一樣的:

[xhtml] view plaincopyprint?
  1. <beanid="car"class="com.baobaotao.fb.Car">
  2.     <propertyname="brand"ref="com.baobaotao.fb.CarBrandType.HONG_QI"/>
  3. </bean>
  4. <bean id="com.baobaotao.fb.CarBrandType.HONG_QI"class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>

當然,也可以直接將FieldRetrievingFactoryBean以內建bean的方式對brand屬性進行賦值,這樣在配置上更緊湊一些:

[xhtml] view plaincopyprint?
  1. <beanid="car"class="com.baobaotao.fb.Car">
  2.     <propertyname="brand">
  3.         <beanid="com.baobaotao.fb.CarBrandType.HONG_QI"class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
  4.         </bean>
  5.     </property>
  6. </bean>

2、Method返回值的注入
Method返回值的注入需要使用MethodInvokingFactoryBean來完成。

在xml配置中,需要設定targetObject和targetMethod來指定目標bean和方法。如果使用靜態方法,則需要指定targetClass和targetMethod

配置檔案如下:

[xhtml] view plaincopyprint?
  1. <beanid="bdog"class="com.baobaotao.fb.Dog">
  2.   <propertyname="age">
  3.     <beanclass="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  4.       <propertyname="targetObject">
  5.         <reflocal="randomAge"/>
  6.       </property>
  7.       <propertyname="targetMethod">
  8.         <value>getAge</value>
  9.       </property>
  10.     </bean>
  11.   </property>
  12. </bean>
  13. <beanid="randomAge"class="com.baobaotao.fd.RandomAge"/>

對於靜態方法:

[xhtml] view plaincopyprint?
  1. <beanid="bdog"class="com.baobaotao.fb.Dog">
  2.   <propertyname="age">
  3.     <beanclass="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  4.       <propertyname="targetClass">
  5.         <value>com.baobaotao.fb.RandomAge</value>
  6.       </property>
  7.       <propertyname="targetMethod">
  8.         <!-- getAge必須是靜態方法 -->
  9.         <value>getAges</value>
  10.       </property>
  11.     </bean>
  12.   </property>
  13. </bean>

使用靜態方法的返回值注入的另一種方式:

[html] view plaincopyprint?
  1. <beanid="config"
  2.         class="Configuration"factory-method="getInstance">
  3.         <!-- 配置檔案路徑 -->
  4.         <constructor-argtype="java.lang.String"value="config.properties"/>
  5. </bean>

運用 factory-method建立單例 ,getInstance指定的是靜態方法,而不是使用建構函式來建立類的例項 [java] view plaincopyprint?
  1. privatestatic Configuration _instance = null;   
  2. private Configuration(String configPath){   
  3.                 //執行你配置檔案的載入 
  4.         System.out.println("configPath");   
  5.     }   
  6.     publicstatic Configuration getInstance(String configPath){   
  7.         logger.info("init...");   
  8.         if(_instance == null){   
  9.             _instance = new Configuration(configPath);   
  10.         }   
  11.         return _instance;   
  12. }