Spring學習筆記--自動裝配Bean屬性

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

  • byName – 把與Bean的屬性具有相同名字(或者ID)的其他Bean自動裝配到Bean的對應屬性中。
  • byType – 把與Bean的屬性具有相同類型的其他Bean自動裝配到Bean的對應屬性中。
  • constructor – 把與Bean的構造器入參具有相同類型的其他Bean自動裝配到Bean的對應屬性中。
  • autodetect – 首先使用costructor進行自動裝配。如果失敗,再嘗試使用byType進行自動裝配。

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

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

然后定義一個Weapon接口的實現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接口的實現Guanyu類(代表關羽):

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>

其中最主要的內容就是兩個bean的聲明部分:

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

第一個bean標簽定義了一個Falchion類型的bean,第二個bean標簽中將第一個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();}
}

輸出結果如下:

GuanYu pick up his weapon.
falcon is attacking!

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

byName自動裝配

改變spring-idol.xml中bean聲明內容的形式如下:

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

得到一樣的結果。

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

byType自動裝配

改變spring-idol.xml中bean聲明內容的形式如下:

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

得到一樣的結果。

這里我們已經不用關注Falchion類對應的bean的id是什么了,因為我們已經定義guanyu bean的autowire屬性為"byType"。這個時候guanyu bean會在上下文中尋找和weapon具有相同類型的類對應的bean。
因為Guanyu類的weapon實現Weapon借口,整個上下文中目前只有一個Weapon接口的實現Falchion類,所以以"byType"類型就檢測到了falchion bean并將其注入到了guanyu bean的weapon屬性中。
但是也會出現一種情況就是檢測的時候可能會出現多個相同type的bean,這個時候就不知道要裝配那個了。比如,我在新建一個實現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" />

在這種情況下就會出錯,因為有兩個bean滿足byType的結果。

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

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

輸出結果如下:

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

從輸出結果中可以看到,關羽沒有使用青龍偃月刀,而是使用方天畫戟進行攻擊了。

注:我看的Spring實戰(第3版)上面說bean的默認primary屬性默認是true,但是我這里用的是spring 4,根據效果來看primary的默認屬性應該是false。
第二種方法是設置其中一個bean的autowire-candidate屬性為false,比如:我們將方天畫戟的autowire-candidate屬性設為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!

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

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

constructor自動裝配

演示constructor之前我需要在在GuanYu類中添加一個構造函數:

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

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

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

輸出結果如下:

GuanYu pick up his weapon.
falcon is attacking!

實現了自動裝配。

最佳自動裝配

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

默認自動裝配

可以在beans標簽中添加default-autowire屬性來設置默認自動裝配策略,如:在beans標簽中添加default-autowire="byType"設置默認自動裝配策略為byType自動裝配。

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

為了演示這個效果,我為Guanyu類添加了一個String成員變量name,雖然關羽就叫關羽,但是人家稱呼他的時候還是會稱呼他云長之類的。新定義的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類的構造函數。)

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

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

當然,我們也可以使用顯示裝配和自動裝配結合,顯示裝配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>

具有一樣效果的輸出。

使用混合裝配的最后一個注意事項:當使用constructor自動裝配策略時,我們必須讓Spring自動裝配構造器的所有入參——我們不能混合使用constructor自動裝配策略和<constructor-arg>元素。

轉載于:https://www.cnblogs.com/moonlightpoet/p/5569239.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457799.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457799.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sudo apt-get nmap 報錯鎖占用

在Ubuntu中用apt-get命令安裝軟件是出現如下錯誤&#xff1a; 網上搜了一下原因&#xff0c;說是有另外一個程序在運行&#xff0c;導致鎖不可用&#xff0c;原因可能是賞析運行更新或安裝沒有正常完成。這是因為上次更新或者安裝沒有正常完成。 網上的兩種解決方法&#xff1…

python逐行讀取txt寫入excel_用python從符合一定格式的txt文檔中逐行讀取數據并按一定規則寫入excel(openpyxl支持Excel 2007 .xlsx格式)...

前幾天接到一個任務&#xff0c;從gerrit上通過ssh命令獲取一些commit相關的數據到文本文檔中&#xff0c;隨后將這些數據存入Excel中。數據格式如下圖所示觀察上圖可知&#xff0c;存在文本文檔中的數據符合一定的格式&#xff0c;通過python讀取、正則表達式處理并寫入Excel文…

筋斗云newcloud錯誤碼列表

響應碼信息備注440Ip Error客戶送IP錯誤441Callee Number Error被叫號碼位數錯誤&#xff08;標準11位正確&#xff0c;錯誤加前綴0&#xff0c;或其他前綴&#xff09;442Called Operator Error被叫運營商錯誤&#xff08;支持移動&#xff0c;不支持聯通電信&#xff09;443N…

Extjs 之 initComponent 和 constructor的區別(轉)

在創建自定義類時&#xff0c;先構造&#xff08;constructor)后初始化&#xff08;initComponent&#xff09;。如&#xff1a;&#xff08;在舊的Extjs 版本中使用 Ext.extend 實現擴展&#xff09; Ext.define(Btn,{ extend:Ext.button.Button, init…

hive遍歷_從Hive中的stored as file_foramt看hive調優

一、行式數據庫和列式數據庫的對比1、存儲比較行式數據庫存儲在hdfs上式按行進行存儲的&#xff0c;一個block存儲一或多行數據。而列式數據庫在hdfs上則是按照列進行存儲&#xff0c;一個block可能有一列或多列數據。2、壓縮比較對于行式數據庫&#xff0c;必然按行壓縮&#…

oracle sql語句 從指定條數查詢

現有表A 查詢從第10行之后的數據 select a from ( select a, rownum r from A ) where r > 10 order by r; 實際工作中例子 select account,acct_name from ( select account, acct_name, rownum r from pmctl_nonsleep_acct ) where r > 10 order by

幫助孩子學會感恩_頁數204_出版日期2015.03_完整版PDF電子書下載

幫助孩子學會感恩_頁數204_出版日期2015.03_完整版PDF電子書下載 帶索引書簽目錄高清版_13813212 下載鏈接http://pan.baidu.com/s/1geEmUeZ 【作 者】&#xff08;英&#xff09;蒂姆惠特尼&#xff08;TimWhitney&#xff09;著【叢書名】陪孩子成長系列叢書【形態項】 204 …

xwpftablecell設置字體樣式_HTML的文字樣式

font 屬性可以用來作為 font-style, font-variant, font-weight, font-size, line-height 和 font-family 屬性的簡寫&#xff0c;或將元素的字體設置為系統字體。字體修改font-family 屬性&#xff1a;設置HTML頁面中的字體font-size 屬性&#xff1a;設置字體大小font-weight…

將中文標點符號替換成英文標點符號

/// 轉全角的函數(SBC case) /// ///任意字符串 /// 全角字符串 /// ///全角空格為12288,半角空格為32 ///其他字符半角(33-126)與全角(65281-65374)的對應關系是&#xff1a;均相差65248 ///public string ToSBC(string input) { //半角轉全角&#xff1a;char[] cinput.ToCh…

Centos6.5升級GCC

由于CentOS自帶的gcc實在是老掉牙了&#xff0c;所以決定升級一下gcc&#xff0c;下面介紹如何進行源碼編譯&#xff0c;升級gcc。 從GNU網站下載你想要的gcc版本&#xff0c;鏈接&#xff1a;ftp://ftp.gnu.org/gnu/gcc/&#xff0c;選擇合適的gcc版本&#xff0c;然后下載&am…

oracle sql語句 exists

exists 這個關鍵字只是個查詢條件 用來判斷后面跟的查詢語句是否查找到記錄 查找到為真 反之為假 例子 select * from ammst_corp a where account 999999999999999999 and exists ( select 1 from pmrgt_unit where unit_code a.open_unit ) 查找 9999999999999999…

python金字塔_高斯金字塔與拉普拉斯金字塔的原理與python構建

高斯金字塔和拉普拉斯金字塔【1】在圖像相關領域應用廣泛&#xff0c;尤其是圖像融合和圖像分割方面。本文從理論和opencv實現兩個方面對兩種金字塔進行了介紹&#xff0c;并給出了二者的視覺效果。1、高斯金字塔在計算機視覺與圖像處理相關任務中&#xff0c;經常需要使用同一…

mongodb在32位機的連接

Windows 32bit版本安裝Mongodb時&#xff0c;會發生的下面問題 2016-05-09T00:09:45.1240800 I STORAGE [initandlisten] exception in initAndListen: 28663 Cannot start server. The default storage engine wiredTiger is not available with this build of mongod. Pleas…

oracle sql 語句 start with ...... connect by prior .......

這個查詢條件可以理解為遞歸查詢 select up_unit_code from pmctl_nuit START WITH unit_code 1188899Q CONNECT BY PRIOR up_unit_code unit_code 語句理解&#xff1a; 首先根據條件 START WITH unit_code 查詢到 up_unit_code 顯示 然后 CONNECT BY P…

cnetos7安裝zabbix3.0.3安裝手冊

親測可用呀。學習好幾天 最好用的文檔詳見附件http://down.51cto.com/data/2251232轉載于:https://blog.51cto.com/11802086/1863554

python文件夾目錄_Python 操作文件、文件夾、目錄大全

#-*- coding: utf-8 -*-importosimportshutil#一. 路徑操作&#xff1a;判斷、獲取和刪除#1. 得到當前工作目錄&#xff0c;即當前Python腳本工作的目錄路徑: os.getcwd()#print: currentpath: f:\LearnPythoncurrentpath os.getcwd()print "currentpath:",currentpa…

LightOJ 1370 Bi-shoe and Phi-shoe(歐拉函數)

題意&#xff1a;題目給出一個歐拉函數值F&#xff08;X&#xff09;&#xff0c;讓我們求>這個函數值的最小數N&#xff0c;使得F&#xff08;N&#xff09; > F(X); 分析&#xff1a;這個題目有兩種做法。第一種&#xff0c;暴力打出歐拉函數表&#xff0c;然后將它調整…

15-CSS基礎-浮動流

浮動 網頁的布局方式 什么是網頁的布局方式? 網頁的布局方式其實就是指瀏覽器是如何對網頁中的元素進行排版的 標準流(文檔流/普通流)排版方式 其實瀏覽器默認的排版方式就是標準流的排版方式在CSS中將元素分為三類, 分別是塊級元素/行內元素/行內塊級元素在標準流中有兩種排版…

oracle sql 排序

當有多個排序列時 并且每列都是降序排序 需要在每個列名后 寫desc

遷移DirectX11到VS2015 Win10

書本中的例子遷移&#xff1a;Introduction to 3D Game Programming with Direct3D 11.0 顏色&#xff1a;DirectXColors.h and the DirectX::Colors namespace. 效果&#xff1a;Effect framework編譯后只需兩個文件&#xff0c;d3dx11effect.h及生成的lib文件。 紋理&#xf…