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>
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。