摘要:構(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ì)。
在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
主要通過兩個(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之間的依賴
總共分為三步:
第一步,將要使用的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)裝配
第一點(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è)
當(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
摘要:如果這個(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中如果沒有寫包名,那么默...
摘要:入門篇學(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...
摘要:前言在的第二篇中主要講解了模塊的使用容器創(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)建和...
摘要:注解只可以裝配只有一個(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,常用于...
摘要:的依賴關(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ù)...
閱讀 3261·2021-11-18 10:02
閱讀 1463·2021-10-12 10:08
閱讀 1264·2021-10-11 10:58
閱讀 1279·2021-10-11 10:57
閱讀 1178·2021-10-08 10:04
閱讀 2133·2021-09-29 09:35
閱讀 783·2021-09-22 15:44
閱讀 1283·2021-09-03 10:30