最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Spring裝配Bean之組件掃描和自動(dòng)裝配

 更新時(shí)間:2017年10月21日 15:09:13   作者:wuxiwei  
本篇文章主要介紹了淺談Spring裝配Bean之組件掃描和自動(dòng)裝配,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

  • 組件掃描:Spring會(huì)自動(dòng)發(fā)現(xiàn)應(yīng)用上下文中所創(chuàng)建的bean。
  • 自動(dòng)裝配:Spring自動(dòng)滿足bean之間的依賴。

案例:音響系統(tǒng)的組件。首先為CD創(chuàng)建CompactDisc接口及實(shí)現(xiàn)類,Spring會(huì)發(fā)現(xiàn)它并將其創(chuàng)建為一個(gè)bean。然后,會(huì)創(chuàng)建一個(gè)CDPlayer類,讓Spring發(fā)現(xiàn)它,并將CompactDisc bean注入進(jìn)來。

創(chuàng)建CompactDisc接口:

package soundsystem;

public interface CompactDisc {
 void play();
}

實(shí)現(xiàn)CompactDisc接口:

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";
 
 public void play() {
  System.out.println("Playing " + title + " by " + artist);
 }
 
}

在SgtPeppers類上使用了 @Component注解,這個(gè)注解表明該類會(huì)作為組件類,并告知Spring要為這個(gè)類創(chuàng)建bean,不需要顯示配置SgtPeppers bean。

不過組件掃描默認(rèn)是不開啟的。我們需要顯示配置一下Spring,從而命令Spring去尋找?guī)в?@Component注解的類,并創(chuàng)建bean。

顯示配置Spring包括Java和XML兩種方式,通過Java啟用組件掃描:

package soundsystem;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class CDPlayerConfig { 
}

注意,類CDPlayerConfig通過Java代碼定義了Spring的裝配規(guī)則,但是可以看出并沒有顯示地聲明任何bean,只不過它使用了 @ComponentScan注解,這個(gè)注解能夠在Spring中啟用組件掃描。

如果沒有其他配置的話,@ComponentScan默認(rèn)會(huì)掃描與配置類相同的包。因?yàn)镃DPlayerConfig位于sound system包中,因此Spring默認(rèn)將會(huì)掃描這個(gè)包以及這個(gè)包下的所有子包,查找所有帶有 @Component注解的類。這樣的話,SgtPeppers類就會(huì)被自動(dòng)創(chuàng)建一個(gè)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: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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd">;

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

</beans>

測(cè)試組件掃描能夠發(fā)現(xiàn)CompactDisc:

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 StandardOutputStreamLog log = new StandardOutputStreamLog();
 
 @Autowired
 private CompactDisc cd;
 
 @Test
 public void cdShouldNotBeNull() {
  assertNotNull(cd);
 }

}

CDPlayerTest使用了Spring的SpringJUnit4ClassRunner,以便在測(cè)試開始的時(shí)候自動(dòng)創(chuàng)建Spring的應(yīng)用上下文。注解ContextConfiguration會(huì)告訴它需要在CDPlayerConfig類中加載配置。因?yàn)镃DPlayerConfig類中包含了 @ComponentScan,因此最終的應(yīng)用上下文應(yīng)該包含CompactDisc bean。

 測(cè)試方法斷言cd屬性部位null。如果不為null。就意味著Spring能發(fā)現(xiàn)CompactDisc類,并自動(dòng)在Spring上下文中創(chuàng)建為bean并注入到測(cè)試代碼中。

為組件掃描的bean命名

Spring應(yīng)用上下文中所有的bean都會(huì)給定一個(gè)ID。默認(rèn)bean命名為類名的第一個(gè)字母變?yōu)樾?,上面的SgtPeppers bean指定的ID為sgtPeppers。

如果想要指定bean ID,可以將ID值傳遞給 @Component注解。如下:

@Component("lonelyHeartsClub")
public class SgtPeppers implements CompactDisc {
 
}

設(shè)置組件掃描的基礎(chǔ)包

@Component注解沒有設(shè)置任何屬性的情況下,按照默認(rèn)規(guī)則,Spring會(huì)以配置類所在的包作為基礎(chǔ)包來掃描組件。但是如果想掃描不同的包,需要做的就是@Component的value屬性中指名包的名稱:

@Configuration
@ComponentScan("soundsystem")
public class CDPlayerConfig { 
}

如果想更加清晰的表明設(shè)置的基礎(chǔ)包,可以通過設(shè)置basePackages屬性:

@Configuration
@ComponentScan(basePackages="soundsystem")
public class CDPlayerConfig { 
}

同時(shí)basePackages支持多個(gè)基礎(chǔ)包的設(shè)置,屬性設(shè)置為數(shù)組即可:

@Configuration
@ComponentScan(basePackages={"soundsystem", "voice"})
public class CDPlayerConfig { 
}

另外還提供一種方法,可以指定包中所含的類或接口:

@Configuration
@ComponentScan(basePackegeClasses={CDPlayer.class, DVDPlayer.class})
public class CDPlayerConfig { 
}

通過為bean添加注解實(shí)現(xiàn)自動(dòng)裝配

自動(dòng)裝配就是讓Spring自動(dòng)滿足bean依賴的一種方式,在滿足依賴的過程中,會(huì)在Spring的上下文中尋找匹配一個(gè)bean需求的其他bean。為了聲明要進(jìn)行自動(dòng)裝配,我們可以借助Spring的 @Autowried注解。

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

package soundsystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CDPlayer implements MediaPlayer {
 private CompactDisc cd;

 @Autowired
 public CDPlayer(CompactDisc cd) {
  this.cd = cd;
 }

 public void play() {
  cd.play();
 }

}

@Autowried注解不僅能夠用在構(gòu)造器上,還能用在Setter方法上。
@Autowired
public void setCompactDisc(CompactDisc cd) {
  this.cd = cd;
}

事實(shí)上,@Autowried注解可以用在類的任何方法上去引入依賴的bean,Spring都會(huì)嘗試滿足方法參數(shù)上所聲明的依賴。

如果沒有匹配的bean,那么在應(yīng)用上下文創(chuàng)建的時(shí)候,Spring會(huì)拋出一個(gè)異常。為了避免出現(xiàn)異常,可以將 @Autowried的required屬性設(shè)置為false:

@Autowired(required=false)
public CDPlayer(CompactDisc cd) {
  this.cd = cd;
}

設(shè)置以后,會(huì)嘗試自動(dòng)裝配,但是如果沒有匹配的bean,Spring默認(rèn)會(huì)處于未裝配的狀態(tài)。但是把required設(shè)置為false時(shí),需要謹(jǐn)慎對(duì)待,如果代碼中沒有進(jìn)行null檢查的話,建議不使用,不然就會(huì)出現(xiàn)NullPointerException異常。

驗(yàn)證自動(dòng)裝配

前面我們的CDPlayerTest測(cè)試類,實(shí)現(xiàn)了自動(dòng)裝配CompactDisc,現(xiàn)在我們借助CDPlayer bean播放CD,表現(xiàn)出依賴的自動(dòng)裝配:

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 StandardOutputStreamLog log = new StandardOutputStreamLog();

 @Autowired
 private MediaPlayer player;
 
 @Autowired
 private CompactDisc cd;
 
 @Test
 public void cdShouldNotBeNull() {
  assertNotNull(cd);
 }

 @Test
 public void play() {
  player.play();
  assertEquals(
    "Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles\n", 
    log.getLog());
 }

}

現(xiàn)在除了注入CompactDisc,還將CDPlayer bean注入到測(cè)試代碼的player成員變量中。

總結(jié)一下,自動(dòng)裝配bean的過程:

 一、把需要被掃描的類,添加 @Component注解,使它能夠被Spring自動(dòng)發(fā)現(xiàn)。
 二、通過顯示的設(shè)置Java代碼 @ComponentScan注解或XML配置,讓Spring開啟組件掃描,并將掃描的結(jié)果類創(chuàng)建bean。
 三、@Autowried注解能偶實(shí)現(xiàn)bean的自動(dòng)裝配,實(shí)現(xiàn)依賴注入。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring注解配置實(shí)現(xiàn)過程詳解

    Spring注解配置實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Spring注解配置實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot多模塊如何統(tǒng)一管理

    SpringBoot多模塊如何統(tǒng)一管理

    本文詳細(xì)介紹了SpringBoot多模塊項(xiàng)目的統(tǒng)一管理方法,包括核心思想、Maven和Gradle的統(tǒng)一管理實(shí)踐以及最佳實(shí)踐和技巧,通過集中化配置、約定優(yōu)于配置、減少重復(fù)性工作,可以提高多模塊項(xiàng)目的可維護(hù)性、一致性和可擴(kuò)展性
    2025-03-03
  • Java中的Sentinel持久化規(guī)則啟動(dòng)

    Java中的Sentinel持久化規(guī)則啟動(dòng)

    這篇文章主要介紹了Java中的Sentinel持久化規(guī)則啟動(dòng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Java中常用的設(shè)計(jì)模式之建造者模式詳解

    Java中常用的設(shè)計(jì)模式之建造者模式詳解

    這篇文章主要為大家詳細(xì)介紹了Java中常用的設(shè)計(jì)模式之建造者模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • IDEA中l(wèi)og4j 無法輸出到本地 properties配置無效問題

    IDEA中l(wèi)og4j 無法輸出到本地 properties配置無效問題

    這篇文章主要介紹了IDEA中l(wèi)og4j 無法輸出到本地 properties配置無效問題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 深入淺析 Spring Security 緩存請(qǐng)求問題

    深入淺析 Spring Security 緩存請(qǐng)求問題

    這篇文章主要介紹了 Spring Security 緩存請(qǐng)求問題,本文通過實(shí)例文字相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2019-04-04
  • Java NegativeArraySizeException異常解決方案

    Java NegativeArraySizeException異常解決方案

    這篇文章主要介紹了Java NegativeArraySizeException異常解決方案,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 解讀String字符串拼接的原理

    解讀String字符串拼接的原理

    這篇文章主要介紹了關(guān)于String字符串拼接的原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java實(shí)現(xiàn)電腦端掃描二維碼

    java實(shí)現(xiàn)電腦端掃描二維碼

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)電腦端掃描二維碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰

    jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰

    JKS文件由公鑰和密鑰構(gòu)成利用Java?Keytool工具生成的文件,它是由公鑰和密鑰構(gòu)成的,下面這篇文章主要給大家介紹了關(guān)于jdk中keytool的使用以及如何提取jks文件中公鑰和私鑰的相關(guān)資料,需要的朋友可以參考下
    2024-03-03

最新評(píng)論

洪泽县| 德惠市| 讷河市| 洮南市| 永城市| 略阳县| 双柏县| 乡宁县| 上虞市| 应城市| 兴山县| 成都市| 禄丰县| 雷州市| 高要市| 临邑县| 福泉市| 淳化县| 沙雅县| 林周县| 尼玛县| 信阳市| 梨树县| 连南| 达拉特旗| 白城市| 墨脱县| 竹山县| 定州市| 毕节市| 灌云县| 香港| 盐城市| 探索| 湘乡市| 大名县| 灵山县| 徐州市| 揭阳市| 康保县| 龙南县|