• 大发电玩官网

  • 大发电玩官网

  • 大发电玩官网

  • 大发电玩官网

大发电玩官网

作者︰  發布ji)ri)期(qi)︰2020-02-26 00:10:29
Tag標簽︰方式(shi)  
  • 在Spring配置文件中使用XML文件進行配置,實(shi)際上是(shi)讓Spring執行了相應的代碼,例如︰

    使用元(yuan)素(su),實(shi)際上是(shi)讓Spring執行無參或有參構(gou)造器使用元(yuan)素(su),實(shi)際上是(shi)讓Spring執行一(yi)次setter方法

    但Java程(cheng)序還可能(neng)有其(qi)他類(lei)型的語句︰調用getter方法、調用普通方法、訪問類(lei)或對象的Field等,而Spring也為(wei)這種語句提供了對應的配置語法︰

    調用getter方法︰使用PropertyPathFactoryBean調用類(lei)或對象的Filed值︰使用FiledRetrievingFactoryBean調用普通方法︰使用MethodInvokingFactoryBean

    注入其(qi)他Bean的屬性值

    PropertyPathFactoryBean用來獲(huo)得目標Bean的屬性值(實(shi)際上就是(shi)調用getter方法返(fan)回(hui)的值),獲(huo)得的值可以注入給(gei)其(qi)他的Bean,也可以直接定義新的Bean。看如下的配置文件︰

    <bean id='person' class='com.abc.Person'> <property name='age' value='30' /> <property name='son'>  <bean class='com.abc.service.Son'>  <property name='age' value='11' /> bean> property>bean><bean id='son2' class='com.abc.service.Son'>  <property name='age'>  <bean id='person.son.age'  class='org.springframework.beans.factory.config.PropertyPathFactoryBean' /> property>bean>

    其(qi)中Person類(lei)和Son類(lei)的屬性可以從配置文件中看出,這不再給(gei)出。主程(cheng)序如下︰

    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實(shi)例的屬性值,不僅(jin)可以注入另一(yi)個Bean,還可將Bean實(shi)例的屬性值直接定義成Bean實(shi)例,這也是(shi)通過PropertyPathFactoryBean完(wan)成的。對上面的配置文件增加這樣一(yi)段︰

    <bean id='son1' class='org.springframework.beans.factory.config.PropertyPathFactoryBean'>  <property name='targetBeanName' value='person' />  <property name='propertyPath' value='son' />bean>

    執行上面的Test類(lei),把(ba)son2換成son1,結果一(yi)樣。

    注入其(qi)他Bean的Field值

    通過FieldRetrievingFactoryBean類(lei),可以將其(qi)他Bean的Field值注入給(gei)其(qi)他Bean,或者直接定義新的Bean。下面是(shi)配置片段︰

    <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>

    測(ce)試主程(cheng)序與上文定義的類(lei)似,這里不再提供,執行結果如下︰

    age=8

    在這個配置中,son對象的age的值,等于java.sql.Connection.TRANSACTION_SERIALIZABLE的 值。在上面的定義中,定義FieldRetrievingFactoryBean工(gong)廠Bean時,指(zhi)定的id並不是(shi)該(gai)Bean實(shi)例的唯一(yi)標識(shi),而是(shi)指(zhi)定 Field的表達式(shi)(即將要被取(qu)出來的值)。

    注意︰Field既(ji)可以是(shi)靜態的,也可以是(shi)非晶態的。上面的配置片段指(zhi)定的Field表達式(shi)是(shi)靜態Field值,因此可以通過類(lei)名直接訪問。如 果Field值是(shi)非靜態的,則應該(gai)通過容器中已(yi)經(jing)存(cun)在的Bean來訪問——即Field表達式(shi)的第(di)一(yi)個短語應該(gai)是(shi)容器中已(yi)經(jing)存(cun)在的Bean。

    Field值也可以定義成Bean實(shi)例,例如,在配置文件中增加下面一(yi)段︰

    <bean id='age' class='org.springframework.beans.factory.config.FieldRetrievingFactoryBean'>  <property name='targetClass' value='java.sql.Connection' />  <property name='targetField' value='TRANSACTION_SERIALIZABLE' />bean>

    在主程(cheng)序中增加如下輸出︰

    System.out.println('age=' + ac.getBean('age'));

    執行結果和上文一(yi)樣。

    使用FieldRetrievingFactoryBean獲(huo)取(qu)Field值時,必(bi)須指(zhi)定如下兩(liang)個屬性︰

    targetClass或targetObject︰分別用于指(zhi)定Field值所在的目標累(lei)或目標對象。如果需(xu)要獲(huo)得的Field是(shi)靜態的,則使用targetClass指(zhi)定目標累(lei);如果Field是(shi)非靜態的,則使用targetObject指(zhi)定目標對象targetField︰指(zhi)定目標類(lei)或目標對象的Field名

    如果Field是(shi)個靜態Field,則有一(yi)種zhi)蛹蚪嗟男捶 /p>

    <bean id='age' class='org.springframework.beans.factory.config.FieldRetrievingFactoryBean'>  <property name='staticField' value='java.sql.Connection.TRANSACTION_SERIALIZABLE' />bean>

    注入其(qi)他Bean的方法返(fan)回(hui)值

    通過MethodInvokingFactoryBean工(gong)廠Bean,可將目標方法的返(fan)回(hui)值注入為(wei)Bean的屬性值。這個工(gong)廠Bean用來獲(huo) 取(qu)指(zhi)定方法的返(fan)回(hui)值,該(gai)方法既(ji)可以是(shi)靜態方法,也可以是(shi)實(shi)例方法;這個值既(ji)可以被注入到指(zhi)定Bean實(shi)例的指(zhi)定屬性,也可以直接定義成Bean實(shi)例。看例 子︰

    <bean id='valueGenerator' class='com.abc.util.ValueGenerator' /><bean id='son1' class='com.abc.service.Son'> <property name='age'>  <bean  class='org.springframework.beans.factory.config.MethodInvokingFactoryBean'>  <property name='targetObject' ref='valueGenerator' />  <property name='targetMethod' value='getValue' /> bean> property>bean>

    下面是(shi)ValueGenerator︰

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

    測(ce)試程(cheng)序依舊打印son1中age的值,代碼略(lue),結果如下︰

    age=2

    如果要調用靜態方法,則把(ba)配置修改為(wei)︰

    <bean id='son1' class='com.abc.service.Son'> <property name='age'>  <bean  class='org.springframework.beans.factory.config.MethodInvokingFactoryBean'>  <property name='targetClass' value='com.abc.util.ValueGenerator' />  <property name='targetMethod' value='getStaticValue' /> bean> property>bean>

    測(ce)試結果為(wei)︰

    age=3

    由于Java是(shi)支持重載的,只給(gei)定方法名,還不足以能(neng)夠確定調用哪個方法,通過上面的配置能(neng)調用成功(gong)是(shi)因為(wei)ValueGenerator中的兩(liang)個方法都沒有參數。如果方法中有參數,該(gai)如何wen)渲媚兀吭諗渲夢募屑尤胍韻履諶藎/p>

    <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'>  <property name='targetObject' value='sysProps' /> <property name='targetMethod' value='getProperty' />  <property name='arguments'>  <list>  <value>java.versionvalue> list> property><bean>

    上例中相當于用”java.version”作為(wei)參數調用了java.lang.System的getProperty方法,返(fan)回(hui)值將創建一(yi)個名為(wei)javaVersion的Bean。即相當于︰

    javaVersion = java.lang.System.getProperty('java.version');

    和前文中的Field一(yi)樣,如果要調用的方法為(wei)靜態方法,也有一(yi)種zhi)蛹蚪嗟姆椒 /p>

    <bean id='myBean' class='org.springframework.beans.factory.config.MethodInvokingFactoryBean'>  <property name='staticMethod' value='com.abc.util.ValueGenerator.getStaticValue' />bean>
About IT165 -廣告服(fu)務 -隱私聲明 -版權申明 -免責條(tiao)款(kuan) -網站(zhan)地圖(tu) -網友投稿 -欢乐谷棋牌官网聯系方式(shi)
本站(zhan)內容來自于互聯網,僅(jin)供用于網絡技術學習,學習中請(qing)遵循相關法律法規(gui)
大发电玩官网 | 下一页