国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

第二章 裝配Bean

xcold / 1771人閱讀

摘要:構(gòu)造器自動(dòng)裝配方法自動(dòng)裝配其他方法自動(dòng)裝配不管是構(gòu)造器,方法還是其他的方法,都會(huì)去嘗試滿足方法參數(shù)上所聲明的依賴。所以上面的輸出是構(gòu)造器自動(dòng)裝配方法自動(dòng)裝配其他方法自動(dòng)裝配使用進(jìn)行自動(dòng)裝配的時(shí)候,需要注意一下幾點(diǎn)。

完整代碼請(qǐng)見:https://github.com/codercuixi...
創(chuàng)建應(yīng)用對(duì)象之間協(xié)作關(guān)系的行為通常稱為裝配(wiring),這也是依賴注入(DI)的本質(zhì)。

2.1 Sprig配置的可選方案

在xml文件中顯式配置(基本上公司中都不用了)
在Java中進(jìn)行顯式配置
隱式的bean發(fā)現(xiàn)機(jī)制和自動(dòng)裝配
建議:盡可能使用自動(dòng)配置的機(jī)制,顯式配置越少越好。
當(dāng)你必須要顯式配置bean的時(shí)候(比如源碼不是由你來維護(hù)的,而你需要這些代碼配置bean的時(shí)候),使用類型安全并且比xml更為強(qiáng)大的JavaConfig。
也就是自己寫的盡量使用自動(dòng)配置,他人的(第三方)使用JavaConfig

2.2 自動(dòng)化配置Bean

主要通過兩個(gè)角度來實(shí)現(xiàn)自動(dòng)化配置
組件掃描(component scanning):Spring會(huì)自動(dòng)發(fā)現(xiàn)應(yīng)用上下文所創(chuàng)建的Bean
自動(dòng)裝配(autowiring):Spring會(huì)自動(dòng)滿足bean之間的依賴

2.2.1 創(chuàng)建可被發(fā)現(xiàn)的Bean

總共分為三步:
第一步,將要使用的Bean添加上@Component注解

package stereo_autoconfig.soundsystem;

import org.springframework.stereotype.Component;

/**
 * Create by cuixin on 2018/8/26
 **/
@Component
public class SgtPeppers implements CompactDisc {
    private String title = "Sgt.Peppers"s Lonely Hearts Club Band";
    private String artist = "The Beatles";
    @Override
    public void play() {
        System.out.println("Play "+title+" by "+ artist);
    }
}

第二步,通過@ComponentScan注解來掃描指定包及其子包中帶有@Component注解的類

package stereo_autoconfig.soundsystem;

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

/**
 * Create by cuixin on 2018/8/26
 * 通過@ComponentScan注解啟動(dòng)組件掃描,
 * 默認(rèn)掃描所在包及其子包中帶有@Component注解的類
 **/
@Configuration
@ComponentScan
public class CDPlayerConfig {
}

第三步,通過@ContextConfiguration配置上下文信息,也就是聲明第二步中使用配置類

package stereo_autoconfig.soundsystem;

import org.junit.Test;
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;

import static org.junit.Assert.assertNotNull;

/**
 * Create by cuixin on 2018/8/26
 **/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {
    @Autowired
    private CompactDisc cd;

    @Test
    public void cdShouldNotBeNull() {
        assertNotNull(cd);
    }

}
2.2.2 為組件掃描的bean命名

默認(rèn)bean的id是將類名的第一個(gè)字母小寫,比如上面的bean的ID就是sgtPeppers.
如果想要指定不同的ID,只需將值傳給@Component注解。

@Component("lonelyHeartClub")
public class SgtPeppers implements CompactDisc {
    ...
}
2.2.3 設(shè)置組件掃描的基礎(chǔ)包 方法一:基于String類型指定基礎(chǔ)包.

Spring實(shí)戰(zhàn)中說這種方式是類型不安全的,我使用IDEA重命名包時(shí),只有在Refactor時(shí)選擇Rename Package才會(huì)更改@ComponentScan中的String值,所以才說這是不安全的。
@ComponentScan默認(rèn)的掃描的是所在包及其子包,如果你掃描其他包,或者想掃描多個(gè)包,應(yīng)該怎么設(shè)置呢?指定不同的基礎(chǔ)包

@Configuration //方式一,指定一個(gè),通過設(shè)置value屬性
@ComponentScan("stereo_autoconfig.soundsystem")
public class CDPlayerConfig {
}
@Configuration //方式二,指定一個(gè),通過設(shè)置basePackages屬性
@ComponentScan(basePackages = "stereo_autoconfig.soundsystem")
public class CDPlayerConfig {
}
@Configuration//方式三,指定多個(gè),通過設(shè)置basePackages為數(shù)組
@ComponentScan(basePackages = {"stereo_autoconfig.soundsystem", "stereo_autoconfig.video"})
public class CDPlayerConfig {
}
方法二:基于包中所含的類或接口來指定基礎(chǔ)包
@Configuration 
@ComponentScan(basePackageClasses = {CompactDisc.class, Video.class})
public class CDPlayerConfig {
}

當(dāng)然為了重構(gòu)時(shí)刪除接口及相關(guān)類,你可以在包下面創(chuàng)建一個(gè)空標(biāo)記接口(Marker Interface),專門用來指定基礎(chǔ)包。

public Interface SoundSystemMarkerInface{
}
@Configuration 
@ComponentScan(basePackageClasses = {SoundSystemMarkerInface.class, Video.class})
public class CDPlayerConfig {
}
2.2.4 通過為bean添加注解實(shí)現(xiàn)自動(dòng)裝配

通過@ComponentScan,我們已經(jīng)可以掃描得到Bean,但是如何裝配這個(gè)Bean依賴的另一個(gè)bean呢?這就是自動(dòng)裝配解決的問題了。
簡(jiǎn)單來說,自動(dòng)裝配就是讓Spring自動(dòng)滿足bean依賴的一種方法。

@Component
public class CDPlayer implements MediaPlayer {
    private CompactDisc cd;
    @Autowired
    public CDPlayer(CompactDisc cd){
        this.cd = cd;
        System.out.println("構(gòu)造器 自動(dòng)裝配");
    }

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

    @Autowired
    public void setCompactDisc(CompactDisc cd){
        this.cd = cd;
        System.out.println("Setter方法 自動(dòng)裝配");
    }
    @Autowired(required = false)
    public void insertDisc(CompactDisc cd){
        this.cd = cd;
        System.out.println("其他方法 自動(dòng)裝配");
    }

}
package stereo_autoconfig.soundsystem;

import org.junit.Test;
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;

import static org.junit.Assert.assertNotNull;

/**
 * Create by cuixin on 2018/8/26
 **/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest {
    @Autowired
    private CompactDisc cd;
    @Autowired
    private MediaPlayer player;

    @Test
    public void cdShouldNotBeNull() {
        assertNotNull(cd);
    }

    @Test
    public void play(){
        player.play();
    }
}

不管是構(gòu)造器,Setter方法還是其他的方法,Spring都會(huì)去嘗試滿足方法參數(shù)上所聲明的依賴。上面依次會(huì)先執(zhí)行構(gòu)造器方法,
然后按照出現(xiàn)代碼順序執(zhí)行其他自動(dòng)注入方法。所以上面的輸出是
構(gòu)造器 自動(dòng)裝配
Setter方法 自動(dòng)裝配
其他方法 自動(dòng)裝配

使用@AutoWired進(jìn)行自動(dòng)裝配的時(shí)候,需要注意一下幾點(diǎn)。

第一點(diǎn),假如有且只有一個(gè)bean匹配依賴需求的話,那么這個(gè)bean就會(huì)被裝配進(jìn)來。
第二點(diǎn),如果沒有匹配的bean,那么在應(yīng)用上下文創(chuàng)建的時(shí)候spring會(huì)拋出一個(gè)異常。
為了避免異常的出現(xiàn),可以將@AutoWired的required屬性設(shè)置為false。但這可能導(dǎo)致這個(gè)bean處于未轉(zhuǎn)配狀態(tài),使用的使用需要判斷是否為空。
第三點(diǎn),如果出現(xiàn)多個(gè)bean滿足依賴關(guān)系的話,spring的@AutoWired自動(dòng)裝配也會(huì)拋出異常,因?yàn)樗麄儾恢肋x哪一個(gè)

2.3 通過Java代碼裝配bean

當(dāng)使用第三方庫(kù)中的組件裝配到你的應(yīng)用中,在這種情況下,是沒有辦法在它的類上添加@ComponentScan和@AutoWired注解的,因此就不能使用自動(dòng)化裝配方案了。

JavaConfig比xml的優(yōu)勢(shì):更為強(qiáng)大,類型安全,并且對(duì)重構(gòu)友好。
盡管不是必須的,但通常會(huì)將JavaConfig放到多帶帶的包中,使他與其他的應(yīng)用程序邏輯分離開來。
步驟:使用@Configuration創(chuàng)建配置類,并使用帶有@Bean的方法聲明bean,最后通過@ContextConfiguration來創(chuàng)建上下文

package stereo_javaconfig.soundsystem;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Create by cuixin on 2018/8/26
 **/
@Configuration //創(chuàng)建配置類
public class CDPlayerConfig {
    @Bean //通過bean注解來聲明簡(jiǎn)單的bean
    public CompactDisc compactDisc(){
        return new SgtPeppers();
    }
    @Bean(name = "cdPlayer") //bean id默認(rèn)使用的方法名,使用方法參數(shù)實(shí)現(xiàn)注入,最優(yōu)方法,可以將CompactDisc放在其他配置類中
    public CDPlayer cdPlayer(CompactDisc compactDisc){
        return new CDPlayer(compactDisc);
    }
//    @Bean(name = "cdPlayer2")
//    //bean id默認(rèn)使用的方法名,引用創(chuàng)建bean的方法實(shí)現(xiàn)注入,spring會(huì)攔截所有compactDisc()調(diào)用,
//    // 確保按照規(guī)定(single,request,session)使用正確的bean,而不是簡(jiǎn)單地每次調(diào)用都生成一個(gè)
//    public CDPlayer cdPlayer2(){
//        return new CDPlayer(compactDisc());
//    }

}
package stereo_javaconfig.soundsystem;

import org.junit.Test;
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;
import stereo_javaconfig.soundsystem.*;

import static org.junit.Assert.*;

/**
 * Create by cuixin on 2018/8/26
 **/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayeTest {
    @Autowired
    private MediaPlayer player;
    @Test
    public void player(){
        player.play();
    }
}
2.4 通過xml裝配Bean(略)

只是維護(hù)早先代碼的時(shí)候你才會(huì)用到這個(gè)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/76965.html

相關(guān)文章

  • Spring總結(jié)(一)

    摘要:如果這個(gè)類的方法有修飾,就成為第二種的裝配方式代碼生成要自動(dòng)裝配的類要保留默認(rèn)構(gòu)造函數(shù),需要裝配的屬性使用來裝配。顯示裝配分為兩種,一種是代碼裝配,一種是裝配。和相比,上面這種形式的中的是調(diào)用默認(rèn)構(gòu)造函數(shù)生成的。 Bean的自動(dòng)裝配 通過@ComponentScan掃描發(fā)現(xiàn)將要裝配到ApplicationContext中的Bean。@ComponentScan中如果沒有寫包名,那么默...

    OpenDigg 評(píng)論0 收藏0
  • 慕課網(wǎng)_《Spring入門篇》學(xué)習(xí)總結(jié)

    摘要:入門篇學(xué)習(xí)總結(jié)時(shí)間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。 《Spring入門篇》學(xué)習(xí)總結(jié) 時(shí)間:2017年1月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://git...

    Ververica 評(píng)論0 收藏0
  • Spring【依賴注入】就是這么簡(jiǎn)單

    摘要:前言在的第二篇中主要講解了模塊的使用容器創(chuàng)建對(duì)象的問題,模塊主要是解決對(duì)象的創(chuàng)建和對(duì)象之間的依賴關(guān)系,因此本博文主要講解如何使用容器來解決對(duì)象之間的依賴關(guān)系回顧以前對(duì)象依賴我們來看一下我們以前關(guān)于對(duì)象依賴,是怎么的歷程直接對(duì)象在最開始,我們 前言 在Spring的第二篇中主要講解了Spring Core模塊的使用IOC容器創(chuàng)建對(duì)象的問題,Spring Core模塊主要是解決對(duì)象的創(chuàng)建和...

    Lyux 評(píng)論0 收藏0
  • 第三章 高級(jí)裝配

    摘要:注解只可以裝配只有一個(gè)實(shí)現(xiàn)類的例如下面的有三個(gè)實(shí)現(xiàn)類,自動(dòng)裝配時(shí),就會(huì)不知道選哪一個(gè),因而會(huì)報(bào)錯(cuò)誤。使用表達(dá)式語(yǔ)言進(jìn)行裝配使用的來引用待補(bǔ)充實(shí)例調(diào)用方法和訪問對(duì)象的屬性對(duì)峙進(jìn)行算數(shù),關(guān)系和邏輯運(yùn)算正則表達(dá)式匹配集合操作 完整代碼請(qǐng)見:https://github.com/codercuixi... 第一部分 @Profile注解的使用 環(huán)境與profile 是否啟用某個(gè)bean,常用于...

    only_do 評(píng)論0 收藏0
  • Spring詳解3.Bean裝配

    摘要:的依賴關(guān)系,根據(jù)依賴關(guān)系配置完成之間的裝配。的行為信息,如生命周期范圍及生命周期各過程的回調(diào)函數(shù)。使用該種裝配模式時(shí),優(yōu)先匹配參數(shù)最多的構(gòu)造函數(shù)。如果提供了默認(rèn)的構(gòu)造函數(shù),則采用否則采用進(jìn)行自動(dòng)裝配。 點(diǎn)擊進(jìn)入我的博客 1 Spring容器與Bean配置信息 Bean配置信息 Bean配置信息是Bean的元數(shù)據(jù)信息,它由一下4個(gè)方面組成: Bean的實(shí)現(xiàn)類 Bean的屬性信息,如數(shù)...

    endiat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<