裝配Bean

Bean -- 一種表達(dá)實(shí)體和信息的規(guī)范返帕,便于封裝重用。

Bean有以下特點(diǎn):

1、所有屬性為private? ? 2究珊、提供默認(rèn)構(gòu)造方法? ? 3、提供Setter和Getter? ? 4纵苛、實(shí)現(xiàn)Serializable接口

Spring裝配Bean三種方式: XML顯式配置剿涮、Java顯式配置、自動(dòng)裝配攻人。


一取试、自動(dòng)裝配

Spring通過以下兩個(gè)角度來實(shí)現(xiàn)自動(dòng)化裝配

1、組件掃描:Spring會(huì)自動(dòng)發(fā)現(xiàn)應(yīng)用上下文中所創(chuàng)建的bean

2贝椿、自動(dòng)裝配:Spring自動(dòng)滿足bean之間的依賴

接下來以一個(gè)CD播放器的例子來演示自動(dòng)裝配

首先定義媒體播放器和CD兩個(gè)接口

package soundsystem;

public interface MediaPlayer {

void play();

}

package soundsystem;

public interface CompactDisc {

void play();

}

定義CD播放器類實(shí)現(xiàn)媒體播放器接口

package soundsystem;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

@Component

public class CDPlayer implements MediaPlayer{

private CompactDisccd;

@Autowired

? ? public CDPlayer(CompactDisc cd){

this.cd = cd;

}

@Override

? ? public void play() {

cd.play();

}

}

@Component注解表明該類會(huì)作為組件類想括,并告知Spring為這個(gè)類創(chuàng)建bean

@Autowired注解表明當(dāng)Spring創(chuàng)建CDPlayer bean 的時(shí)候,會(huì)通過這個(gè)構(gòu)造器來進(jìn)行實(shí)例化并且會(huì)傳入一個(gè)可設(shè)置給CompactDisc類型的bean烙博。

@Autowired注解可以用在類的任何方法上瑟蜈,還可以用于成員變量上。@Inject源于Java依賴注入規(guī)范渣窜,在大多場(chǎng)景下可與@Autowired互換铺根。


然后定義一個(gè)SgtPeppers類,它實(shí)現(xiàn)了CompactDisc接口乔宿,也是一個(gè)組件類位迂。

package soundsystem;

import org.springframework.stereotype.Component;

@Component

public class SgtPeppers implements CompactDisc{

private String title ="Sgt. Pepper's Lonely Hearts Club Band";

private String artist ="The Beatles";

@Override

? ? public void play() {

System.out.println("Playing "+title+" by "+artist);

}

}

最后定義一個(gè)CDPlayer配置類

package soundsystem;

import org.springframework.context.annotation.*;

@Configuration

@ComponentScan

public class CDPlayerConfig {

}

@Configuration代表這是一個(gè)配置類

@ComponentScan表示啟用組件掃描

組件掃描可以在一個(gè)CD播放器一張CD的時(shí)候正常工作,但是在有兩張CD的時(shí)候就不能正常工作了详瑞,因?yàn)樗恢缿?yīng)該播放哪一張CD掂林,這里我們只有一張披頭士的CD,關(guān)于多張CD的情況留到后面處理坝橡。?

我們也可以用xml來實(shí)現(xiàn)組件掃描

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

? ? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

? ? ? xmlns:context="http://www.springframework.org/schema/context"

? ? ? xmlns:c="http://www.springframework.org/schema/c"

? ? ? xmlns:p="http://www.springframework.org/schema/p"

? ? ? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

? ? ? http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="soundsystem" />

</beans>

<context:component-scan base-package="soundsystem" />表示會(huì)在soundsystem這個(gè)包內(nèi)找合適的bean注入到CDplayer

現(xiàn)在定義CDPlayerTest類測(cè)試一下

package soundsystem;

import static org.junit.Assert.*;

import org.junit.Rule;

import org.junit.Test;

import org.junit.contrib.java.lang.system.StandardOutputStreamLog;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes = CDPlayerConfig.class)

public class CDPlayerTest {

@Rule

? ? public final StandardOutputStreamLoglog =new StandardOutputStreamLog();

@Autowired

? ? private MediaPlayerplayer;

@Autowired

? ? private CompactDisccd;

@Test

? ? public void cdShouldNotNull(){

assertNotNull(cd);

}

@Test

? ? public void play(){

player.play();

assertEquals("Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles\n",log.getLog());

}

}

@ContextConfiguration(classes = CDPlayerConfig.class)會(huì)使用CDPlayerConfig這個(gè)類來配置應(yīng)用上下文泻帮。

下面試試使用XML配置

package soundsystem;

import static org.junit.Assert.*;

import org.junit.Rule;

import org.junit.Test;

import org.junit.contrib.java.lang.system.StandardOutputStreamLog;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations ="classpath:soundsystem.xml")

public class CDPlayerXMLConfigTest {

@Rule

? ? public final StandardOutputStreamLoglog =new StandardOutputStreamLog();

@Autowired

? ? private MediaPlayerplayer;

@Autowired

? ? private CompactDisccd;

@Test

? ? public void cdShouldNotNull(){

assertNotNull(cd);

}

@Test

? ? public void play(){

player.play();

assertEquals("Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles\n",log.getLog());

}

}

@ContextConfiguration(locations ="classpath:soundsystem.xml")會(huì)使用soundsystem.xml來配置應(yīng)用上下文。

二计寇、Java顯式配置

媒體播放器和CD接口保持不變

接下來看看CD播放器類與自動(dòng)裝配有什么不同之處

package soundsystem;

import org.springframework.beans.factory.annotation.Autowired;

public class CDPlayer implements MediaPlayer {

private CompactDisccd;

? @Autowired

? public CDPlayer(CompactDisc cd) {

this.cd = cd;

? }

public void play() {

cd.play();

? }

}

與自動(dòng)裝配比較可以發(fā)現(xiàn)類聲明上面少了@Component注解 我們沒有將CDPlayer聲明為一個(gè)組件類

SgtPeppers類也沒有@Component注解

重點(diǎn)來看看CDplayerConfig類

package soundsystem;

import org.springframework.context.annotation.*;

@Configuration

public class CDPlayerConfig {

@Bean

? ? public CompactDisc compactDisc(){

return new SgtPeppers();

? ? }

@Bean

? ? public CDPlayer cdPlayer(CompactDisc cd){

return new CDPlayer(cd);

? ? }

}

這里沒有@ComponentScan注解然后在配置類中自己定義了兩個(gè)bean從第一個(gè)bean可以看到如果需要注入CompactDisc bean的時(shí)候注入的是SgtPeppers類對(duì)象锣杂,需要注入CDPlayer bean 時(shí)注入的時(shí)候注入的是CdPlayer對(duì)象。

總結(jié)一下:Java顯式配置與自動(dòng)裝配主要區(qū)別在配置類上番宁,Java配置需要顯示地聲明bean元莫,自動(dòng)裝配配置類有@ComponentScan注解,它會(huì)自動(dòng)掃描帶有@Component注解的bean來將其注入到合適的地方蝶押。

三踱蠢、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"

? xmlns:c="http://www.springframework.org/schema/c"

? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

? <bean id="compactDisc" class="soundsystem.SgtPeppers" />

? <bean id="cdPlayer" class="soundsystem.CDPlayer"

? ? ? ? c:cd-ref="compactDisc" />

<bean id="compactDisc" class="soundsystem.SgtPeppers" />

@Bean

? ? public CompactDisc compactDisc(){

return new SgtPeppers();

? ? }

上述的一行XML配置和上面的一段Java配置起到的作用是一樣的。


XML中參數(shù)的聲明是由<constructor-arg>標(biāo)簽來實(shí)現(xiàn)播聪,想要注入一個(gè)集合可以使用<list>標(biāo)簽包裹集合內(nèi)所有項(xiàng)

使用<value>標(biāo)簽包裹集合內(nèi)的一項(xiàng)朽基。

<bean id="compactDisc"

? ? ? class="soundsystem.BlankDisc"

? ? ? c:_0="Sgt. Pepper's Lonely Hearts Club Band"

? ? ? c:_1="The Beatles">

c:_0代表構(gòu)造器的第一個(gè)參數(shù)布隔,c:_1代表構(gòu)造器的第二個(gè)參數(shù)。

四稼虎、混合配置

package soundsystem;

import org.springframework.context.annotation.*;

@Configuration

@Import(CDPlayerConfig.class)

@ImportResource("classpath:cd-config.xml")

public class SoundSystemConfig {

}

加粗的兩個(gè)注解從一個(gè)Java配置類和一個(gè)XML文檔加載上下文衅檀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市霎俩,隨后出現(xiàn)的幾起案子哀军,更是在濱河造成了極大的恐慌,老刑警劉巖打却,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杉适,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡柳击,警方通過查閱死者的電腦和手機(jī)猿推,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捌肴,“玉大人蹬叭,你說我怎么就攤上這事∽粗” “怎么了秽五?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饥悴。 經(jīng)常有香客問我坦喘,道長(zhǎng),這世上最難降的妖魔是什么西设? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任瓣铣,我火速辦了婚禮,結(jié)果婚禮上贷揽,老公的妹妹穿的比我還像新娘坯沪。我一直安慰自己,他們只是感情好擒滑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叉弦,像睡著了一般丐一。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淹冰,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天库车,我揣著相機(jī)與錄音,去河邊找鬼樱拴。 笑死柠衍,一個(gè)胖子當(dāng)著我的面吹牛洋满,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播珍坊,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牺勾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了阵漏?” 一聲冷哼從身側(cè)響起驻民,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎履怯,沒想到半個(gè)月后回还,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叹洲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年柠硕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片运提。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝗柔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糙捺,到底是詐尸還是另有隱情诫咱,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布洪灯,位于F島的核電站坎缭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏签钩。R本人自食惡果不足惜掏呼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铅檩。 院中可真熱鬧憎夷,春花似錦、人聲如沸昧旨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兔沃。三九已至蒋得,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乒疏,已是汗流浹背额衙。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窍侧。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓县踢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伟件。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硼啤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 本章內(nèi)容: 聲明Bean 構(gòu)造器注入和Setter方法注入 裝配Bean 控制bean的創(chuàng)建和銷毀 任何一個(gè)成功的...
    謝隨安閱讀 1,644評(píng)論 0 9
  • 通過之前的兩篇我們能在本地搭建單一和集群兩種方式的dubbo服務(wù),這篇我們來看 springmvc+spring+...
    安琪拉_4b7e閱讀 2,161評(píng)論 0 6
  • 依賴注入對(duì)象的依賴關(guān)系由系統(tǒng)中負(fù)責(zé)協(xié)調(diào)各個(gè)對(duì)象的第三方組件(Spring)在創(chuàng)建時(shí)進(jìn)行設(shè)定锋爪。一個(gè)對(duì)象只通過接口來表...
    米都都閱讀 192評(píng)論 0 0
  • Spring容器負(fù)責(zé)創(chuàng)建應(yīng)用程序中的bean并通過DI來協(xié)調(diào)這些對(duì)象之間的關(guān)系丙曙,我們需要做的就是告訴Spring要...
    xdoyf閱讀 495評(píng)論 0 1
  • 昨晚牙疼一夜,咬了兩顆花椒睡著了其骄。誰這么有才亏镰,牙疼讓咬花椒,花椒不能止疼拯爽,卻可以讓半邊臉麻木索抓。麻木中又有隱隱的疼,...
    小小草85閱讀 323評(píng)論 0 1