日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring学习笔记--自动装配Bean属性

發(fā)布時間:2023/12/18 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring学习笔记--自动装配Bean属性 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Spring提供了四種類型的自動裝配策略:

  • byName – 把與Bean的屬性具有相同名字(或者ID)的其他Bean自動裝配到Bean的對應(yīng)屬性中。
  • byType – 把與Bean的屬性具有相同類型的其他Bean自動裝配到Bean的對應(yīng)屬性中。
  • constructor – 把與Bean的構(gòu)造器入?yún)⒕哂邢嗤愋偷钠渌鸅ean自動裝配到Bean的對應(yīng)屬性中。
  • autodetect – 首先使用costructor進(jìn)行自動裝配。如果失敗,再嘗試使用byType進(jìn)行自動裝配。

我這里以關(guān)羽和青龍偃月刀為例: 首先定義一個武器接口Weapon:

package com.moonlit.myspring;public interface Weapon {public void attack(); }

然后定義一個Weapon接口的實(shí)現(xiàn)Falchion類:

package com.moonlit.myspring;public class Falchion implements Weapon {public void attack() {System.out.println("falcon is attacking!");} }

定義一個英雄接口Hero:

package com.moonlit.myspring;public interface Hero {public void perform(); }

然后定義一個Hero接口的實(shí)現(xiàn)Guanyu類(代表關(guān)羽):

package com.moonlit.myspring;public class GuanYu implements Hero {private Weapon weapon;public void perform() {System.out.println("GuanYu pick up his weapon.");weapon.attack();}public Weapon getWeapon() {return weapon;}public void setWeapon(Weapon weapon) {this.weapon = weapon;} }

在不涉及自動裝配的情況下,我們想要通過Spring的DI將Fachion類對象注入到Guanyu類的weapon屬性中,可以新建一個xml文件(我這里取名為spring-idol.xml)并在里面填寫:

spring-idol.xml:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="falchion" class="com.moonlit.myspring.Falchion" /><bean id="guanyu" class="com.moonlit.myspring.GuanYu"><property name="weapon" ref="falchion" /></bean></beans>

其中最主要的內(nèi)容就是兩個bean的聲明部分:

<bean id="falchion" class="com.moonlit.myspring.Falchion" /><bean id="guanyu" class="com.moonlit.myspring.GuanYu"><property name="weapon" ref="falchion" /></bean>

第一個bean標(biāo)簽定義了一個Falchion類型的bean,第二個bean標(biāo)簽中將第一個bean作為weapon的值裝配到了weapon屬性中。 然后我們可以寫一個測試程序來查看效果:

package com.moonlit.practice;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import com.moonlit.myspring.Hero;public class AutowirePractice {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-idol.xml");Hero guanyu = (Hero) context.getBean("guanyu");guanyu.perform();} }

輸出結(jié)果如下:

GuanYu pick up his weapon. falcon is attacking!

到目前為止還沒有涉及到自動裝配的內(nèi)容,接下來開始講述自動裝配的內(nèi)容。

byName自動裝配

改變spring-idol.xml中bean聲明內(nèi)容的形式如下:

<bean id="weapon" class="com.moonlit.myspring.Falchion" /><bean id="guanyu" class="com.moonlit.myspring.GuanYu" autowire="byName" />

得到一樣的結(jié)果。

我們將Falchion類的id去了一個和Guanyu類的屬性weapon一樣的名字,并且在guanyu bean中添加了autowire="byName"用于指明裝配類型是byName自動裝配。這個時候guanyu bean就是在上下文中找名為weapon的bean裝配到他自己的weapon屬性中。

byType自動裝配

改變spring-idol.xml中bean聲明內(nèi)容的形式如下:

<bean id="falchion" class="com.moonlit.myspring.Falchion" /><bean id="guanyu" class="com.moonlit.myspring.GuanYu" autowire="byType" />

得到一樣的結(jié)果。

這里我們已經(jīng)不用關(guān)注Falchion類對應(yīng)的bean的id是什么了,因?yàn)槲覀円呀?jīng)定義guanyu bean的autowire屬性為"byType"。這個時候guanyu bean會在上下文中尋找和weapon具有相同類型的類對應(yīng)的bean。
因?yàn)镚uanyu類的weapon實(shí)現(xiàn)Weapon借口,整個上下文中目前只有一個Weapon接口的實(shí)現(xiàn)Falchion類,所以以"byType"類型就檢測到了falchion bean并將其注入到了guanyu bean的weapon屬性中。
但是也會出現(xiàn)一種情況就是檢測的時候可能會出現(xiàn)多個相同type的bean,這個時候就不知道要裝配那個了。比如,我在新建一個實(shí)現(xiàn)Weapon接口的方天畫戟類HalBerd:

package com.moonlit.myspring;public class Halberd implements Weapon {public void attack() {System.out.println("halberd is attacking!!!");} }

并且在xml文件中聲明一個新的halberd bean:

<bean id="halberd" class="com.moonlit.myspring.Halberd" />

在這種情況下就會出錯,因?yàn)橛袃蓚€bean滿足byType的結(jié)果。

這個時候有兩種解決辦法:
第一種方法是將其中一個bean的primary屬性設(shè)為false,比如:我們將方天畫戟falchion bean的primary屬性設(shè)為true,以防冠以使用方天畫戟(很好奇呂布死了之后,赤兔馬歸關(guān)羽了,方天畫戟去哪里了):

<bean id="falchion" class="com.moonlit.myspring.Falchion" /><bean id="halberd" class="com.moonlit.myspring.Halberd" primary="true" /><bean id="guanyu" class="com.moonlit.myspring.GuanYu" autowire="byType" />

輸出結(jié)果如下:

GuanYu pick up his weapon. halberd is attacking!!!

從輸出結(jié)果中可以看到,關(guān)羽沒有使用青龍偃月刀,而是使用方天畫戟進(jìn)行攻擊了。

注:我看的Spring實(shí)戰(zhàn)(第3版)上面說bean的默認(rèn)primary屬性默認(rèn)是true,但是我這里用的是spring 4,根據(jù)效果來看primary的默認(rèn)屬性應(yīng)該是false。
第二種方法是設(shè)置其中一個bean的autowire-candidate屬性為false,比如:我們將方天畫戟的autowire-candidate屬性設(shè)為false:

<bean id="falchion" class="com.moonlit.myspring.Falchion" /><bean id="halberd" class="com.moonlit.myspring.Halberd" primary="true" autowire-candidate="false" /><bean id="guanyu" class="com.moonlit.myspring.GuanYu" autowire="byType" />

這個時候測試程序的輸出如下:

GuanYu pick up his weapon. falcon is attacking!

可以看到這個時候關(guān)羽又重拾了青龍偃月刀。可以看到,當(dāng)halberd bean的autowire-candidate屬性設(shè)為false時,他將不會作為自動裝配的競選bean之一,這個時候雖然halberd的primary屬性為true,但是halberd bean沒有參與自動裝配的競選,所以自動裝配到了falchion。

這種感覺就好像:“隔壁村李小花覬覦我已久,但我是一個要成為海賊王的男人,于是拒絕了她……最終她嫁給了隔壁老王,過上了幸福的生活”。

constructor自動裝配

演示constructor之前我需要在在GuanYu類中添加一個構(gòu)造函數(shù):

public GuanYu(Weapon weapon) {this.weapon = weapon;}

在xml文件中設(shè)置guanyu bean的autowire屬性為constructor:

<bean id="falchion" class="com.moonlit.myspring.Falchion" /><bean id="guanyu" class="com.moonlit.myspring.GuanYu" autowire="constructor" />

輸出結(jié)果如下:

GuanYu pick up his weapon. falcon is attacking!

實(shí)現(xiàn)了自動裝配。

最佳自動裝配

書上說是將autowire屬性設(shè)為autodetect,但是我發(fā)現(xiàn)在我使用的spring 4(我看的書是spring 3)版本中沒有autodetect,autowire屬性只有byName,byType,constructor,default,no這些屬性。

默認(rèn)自動裝配

可以在beans標(biāo)簽中添加default-autowire屬性來設(shè)置默認(rèn)自動裝配策略,如:在beans標(biāo)簽中添加default-autowire="byType"設(shè)置默認(rèn)自動裝配策略為byType自動裝配。

混合使用自動裝配和顯示裝配

為了演示這個效果,我為Guanyu類添加了一個String成員變量name,雖然關(guān)羽就叫關(guān)羽,但是人家稱呼他的時候還是會稱呼他云長之類的。新定義的GuanYu類如下:

package com.moonlit.myspring;public class GuanYu implements Hero {private String name;private Weapon weapon; // public GuanYu(String name, Weapon weapon) { // this.name = name; // this.weapon = weapon; // }public void perform() {System.out.println(name + " pick up his weapon.");weapon.attack();}public Weapon getWeapon() {return weapon;}public void setWeapon(Weapon weapon) {this.weapon = weapon;}public String getName() {return name;}public void setName(String name) {this.name = name;} }

(這里我注釋掉了GuanYu類的構(gòu)造函數(shù)。)

一個完全顯示裝配的例子如下:

<bean id="falchion" class="com.moonlit.myspring.Falchion" /><bean id="guanyu" class="com.moonlit.myspring.GuanYu"><property name="name" value="Guan Yun Chang" /><property name="weapon" ref="falchion" /></bean>

當(dāng)然,我們也可以使用顯示裝配和自動裝配結(jié)合,顯示裝配name,自動裝配weapon,如下:

<bean id="falchion" class="com.moonlit.myspring.Falchion" /><bean id="guanyu" class="com.moonlit.myspring.GuanYu" autowire="byType"><property name="name" value="Guan Yun Chang" /></bean>

具有一樣效果的輸出。

使用混合裝配的最后一個注意事項(xiàng):當(dāng)使用constructor自動裝配策略時,我們必須讓Spring自動裝配構(gòu)造器的所有入?yún)ⅰ覀儾荒芑旌鲜褂胏onstructor自動裝配策略和<constructor-arg>元素。

轉(zhuǎn)載于:https://www.cnblogs.com/moonlightpoet/p/5569239.html

總結(jié)

以上是生活随笔為你收集整理的Spring学习笔记--自动装配Bean属性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。