程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring注入方法有哪些

Spring注入方法有哪些

編輯:關於JAVA

Spring注入方法有哪些。本站提示廣大學習愛好者:(Spring注入方法有哪些)文章只能為提供參考,不一定能成為您想要的結果。以下是Spring注入方法有哪些正文


在Spring設置裝備擺設文件中應用XML文件停止設置裝備擺設,現實上是讓Spring履行了響應的代碼,例如:

應用<bean>元素,現實上是讓Spring履行無參或有參結構器
應用<property>元素,現實上是讓Spring履行一次setter辦法

但Java法式還能夠有其他類型的語句:挪用getter辦法、挪用通俗辦法、拜訪類或對象的Field等,而Spring也為這類語句供給了對應的設置裝備擺設語法:

挪用getter辦法:應用PropertyPathFactoryBean
挪用類或對象的Filed值:應用FiledRetrievingFactoryBean
挪用通俗辦法:應用MethodInvokingFactoryBean

注入其他Bean的屬性值

PropertyPathFactoryBean用來取得目的Bean的屬性值(現實上就是挪用getter辦法前往的值),取得的值可以注入給其他的Bean,也能夠直接界說新的Bean。看以下的設置裝備擺設文件:

<bean id="person" class="com.abc.Person">
 <property name="age" value="30" />
 <property name="son">
  <!-- 應用嵌套Bean界說屬性值 -->
  <bean class="com.abc.service.Son">
   <property name="age" value="11" />
  </bean>
 </property>
</bean>

<bean id="son2" class="com.abc.service.Son">
 <!-- age屬性不是直接注入,而是將person中的son的age屬性賦值給son2的age屬性 -->
 <property name="age">
  <!-- 留意這裡應用的是PropertyPathFactoryBean -->
  <bean id="person.son.age" 
   class="org.springframework.beans.factory.config.PropertyPathFactoryBean" />
 </property>
</bean>

個中Person類和Son類的屬性可以從設置裝備擺設文件中看出,這不再給出。主法式以下:

public class Test {
 public static void main(String args[]) {
  ApplicationContext ac = 
   new ClassPathXmlApplicationContext("applicationContext.xml");
  System.out.println("age=" + ac.getBean("son2", Son.class).getAge());
 }
}

輸入成果:
age=11

Bean實例的屬性值,不只可以注入另外一個Bean,還可將Bean實例的屬性值直接界說成Bean實例,這也是經由過程PropertyPathFactoryBean完成的。對下面的設置裝備擺設文件增長如許一段:

<bean id="son1" 
 class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
 <!-- 肯定目的Bean,注解son1來自哪一個Bean的組件 -->
 <property name="targetBeanName" value="person" />
 <!-- 肯定屬性,注解son1來自目的Bean的哪一個屬性 -->
 <property name="propertyPath" value="son" />
</bean>

履行下面的Test類,把son2換成son1,成果一樣。

注入其他Bean的Field值

經由過程FieldRetrievingFactoryBean類,可以將其他Bean的Field值注入給其他Bean,或許直接界說新的Bean。上面是設置裝備擺設片斷:

<bean id="son" class="com.abc.service.Son">
 <property name="age">
  <bean id="java.sql.connection.TRANSACTION_SERIALIZABLE"
   class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" />
 </property>
</bean>

測試主法式與上訂婚義的相似,這裡不再供給,履行成果以下:
age=8

在這個設置裝備擺設中,son對象的age的值,等於java.sql.Connection.TRANSACTION_SERIALIZABLE的 值。在下面的界說中,界說FieldRetrievingFactoryBean工場Bean時,指定的id其實不是該Bean實例的獨一標識,而是指定 Field的表達式(行將要被掏出來的值)。

留意:Field既可所以靜態的,也能夠長短靜態的。下面的設置裝備擺設片斷指定的Field表達式是靜態Field值,是以可以經由過程類名直接拜訪。如 果Field值長短靜態的,則應當經由過程容器中曾經存在的Bean來拜訪——即Field表達式的第一個短語應當是容器中曾經存在的Bean。
Field值也能夠界說成Bean實例,例如,在設置裝備擺設文件中增長上面一段:

<bean id="age" 
 class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
 <!-- targetClass指定Field地點的目的類 -->
 <property name="targetClass" value="java.sql.Connection" />
 <!-- targetField指定Field名 -->
 <property name="targetField" value="TRANSACTION_SERIALIZABLE" />
</bean>

在主法式中增長以下輸入:
System.out.println("age=" + ac.getBean("age"));
履行成果和上文一樣。

應用FieldRetrievingFactoryBean獲得Field值時,必需指定以下兩個屬性:
targetClass或targetObject:分離用於指定Field值地點的目的累或目的對象。假如須要取得的Field是靜態的,則應用targetClass指定目的累;假如Field長短靜態的,則應用targetObject指定目的對象
targetField:指定目的類或目的對象的Field名

假如Field是個靜態Field,則有一種加倍簡練的寫法:

<bean id="age" 
 class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
 <!-- value指定哪一個類的哪一個靜態域值 -->
 <property name="staticField" value="java.sql.Connection.TRANSACTION_SERIALIZABLE" />
</bean>

注入其他Bean的辦法前往值

經由過程MethodInvokingFactoryBean工場Bean,可將目的辦法的前往值注入為Bean的屬性值。這個工場Bean用來獲 取指定辦法的前往值,該辦法既可所以靜態辦法,也能夠是實例辦法;這個值既可以被注入到指定Bean實例的指定屬性,也能夠直接界說成Bean實例。看例 子:

<bean id="valueGenerator" class="com.abc.util.ValueGenerator" />
<bean id="son1" class="com.abc.service.Son">
 <property name="age">
  <!-- 獲得辦法前往值:挪用valueGenerator的getValue辦法 -->
  <bean 
   class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
   <property name="targetObject" ref="valueGenerator" />
   <property name="targetMethod" value="getValue" />
  </bean>
 </property>
</bean>

上面是ValueGenerator:

public class ValueGenerator {
 public int getValue() { return 2; }
 public static int getStaticValue () { return 3;}
}

測試法式照舊打印son1中age的值,代碼略,成果以下:
age=2

假如要挪用靜態辦法,則把設置裝備擺設修正為:

<bean id="son1" class="com.abc.service.Son">
 <property name="age">
  <!-- 獲得辦法前往值:挪用valueGenerator的getStaticValue辦法 -->
  <bean 
   class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
   <property name="targetClass" value="com.abc.util.ValueGenerator" />
   <property name="targetMethod" value="getStaticValue" />
  </bean>
 </property>
</bean>

測試成果為:
age=3

因為Java是支撐重載的,只給定辦法名,還缺乏以可以或許肯定挪用哪一個辦法,經由過程下面的設置裝備擺設能挪用勝利是由於ValueGenerator中的兩個辦法都沒有參數。假如辦法中有參數,該若何設置裝備擺設呢?在設置裝備擺設文件中參加以下內容:

<bean id="sysProps" 
 class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
 <property name="targetClass" value="java.lang.System" />
 <property name="targetMethod" value="getProperties" />
<bean>
<bean id="javaVersion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
 <!-- 指向下面的sysProps Bean -->
 <property name="targetObject" value="sysProps" />
 <property name="targetMethod" value="getProperty" />
 <!-- 這裡設置裝備擺設參數 -->
 <property name="arguments">
  <!-- 應用list元素列出挪用辦法的多個參數 -->
  <list>
   <value>java.version</value>
  </list>
 </property>
<bean>

上例中相當於用”java.version”作為參數挪用了java.lang.System的getProperty辦法,前往值將創立一個名為javaVersion的Bean。即相當於:
javaVersion = java.lang.System.getProperty("java.version");

和前文中的Field一樣,假如要挪用的辦法為靜態辦法,也有一種加倍簡練的辦法:

<bean id="myBean"
 class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
 <!-- 應用staticMethod屬性,直接指定目的類的目的辦法 -->
 <property name="staticMethod" value="com.abc.util.ValueGenerator.getStaticValue" />
</bean>

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved