不知大家可曾想過這樣一些問題:“在基于XML或基于Java的顯示配置中,假如需要配置的Bean很多,這時把所有Bean的配置資訊全都填在一個組態檔里,難道不會導致組態檔非常臃腫,非常難以維護嗎?還有,假如因為某些原因不得不把一些Bean的配置資訊填在XML組態檔里,把一些Bean的配置資訊填在Java配置類里,而XML組態檔里的Bean與Java配置類里的Bean是有依賴關系的,這時又該怎么配置?”
面對這樣一些問題,混合配置是個好的解決方案,因為混合配置能把多個XML組態檔,多個Java配置類串聯起來,使之作為一個整體能被Spring容器加載之后進行Bean的創建與裝配,具體來說,混合配置支持這樣一些配置方式:
1.在Java配置類里添加@Import注解,匯入其它Java配置類,
2.在Java配置類里添加@ImportResource注解,匯入XML組態檔,
3.在XML組態檔里添加<import>元素,匯入其它XML組態檔,
4.在XML組態檔里添加<bean>元素,匯入Java配置類,
至于這些配置方式具體是怎樣的,且讓我們分成四個小節仔細談談,
@Import注解與Java配置類的匯入
顧名思義,@Import注解就是用來匯入某些東西的;而這東西,就是Java配置類,比如,我們可把Music類的創建資訊放在MusicConfig配置類里:
1 @Configuration 2 public class MusicConfig { 3 @Bean("music") 4 public Music produceMusic() { 5 return new Music("Dream"); 6 } 7 }
把Player類的創建資訊放在PlayerConfig配置類里:
1 @Configuration 2 public class PlayerConfig { 3 @Bean("player") 4 public Player producePlayer(Music playingMusic) { 5 return new Player(playingMusic); 6 } 7 }
之后通過@Import注解把這兩個配置類匯入AppConfig配置類中:
1 @Configuration 2 @Import(value = https://www.cnblogs.com/evanlin/p/{ MusicConfig.class, PlayerConfig.class }) 3 public class AppConfig { 4 }
@Import注解有個Class<?>[]型別的value屬性,能向它指定一個Class<?>型別的陣列,匯入多個Java配置類,因此,AppConfig配置類通過 @Import(value = https://www.cnblogs.com/evanlin/p/{ MusicConfig.class, PlayerConfig.class }) 注解匯入MusicConfig,PlayerConfig兩個配置類,之后,我們只要把AppConfig配置類交給Spring容器,Spring容器就能創建Bean了,如下所示:
1 try (var context = new AnnotationConfigApplicationContext(AppConfig.class)) { 2 var player = context.getBean("player", Player.class); 3 // 省略其它代碼... 4 }
這段代碼把AppConfig配置類交給AnnotationConfigApplicationContext型別的Spring容器,Spring容器瞧見配置類上的@Import注解之后,就會匯入@Import注解指定的MusicConfig和PlayerConfig配置類,這意味著Spring容器不僅會加載AppConfig配置類,還會加載匯入的MusicConfig和PlayerConfig配置類;根據AppConfig,MusicConfig,PlayerConfig三個配置類提供的配置資訊開始Bean的創建,
還有,Player型別的Bean是依賴于Music型別的Bean的,因此,配置方法 public Player producePlayer(Music playingMusic) 帶有一個Music型別的引數,Spring容器呼叫這個方法創建Bean的時候,知道配置方法帶有一個Music型別的引數,于是自動從Spring容器里找到Music型別的Bean裝配上去,當然,我們也可往配置方法添加@Autowired注解,告訴Spring容器進行Bean的自動裝配;可往配置方法添加@Primary注解或@Qualifier注解,告訴Spring容器如何解決自動裝配的歧義性,由此可見,不同配置類之間的Bean是能通過自動裝配完成組裝的,當然,配置類分為兩種:一種是顯式配置;一種是自動配置,@Import注解匯入自動配置的配置類和匯入顯式配置的配置類是一樣的,不再贅敘,
@ImportResource注解與XML組態檔的匯入
Java配置類除了能用@Import注解匯入其它配置類之外,也能使用@ImportResource注解匯入XML組態檔,也就是說,Spring是支持Java配置類與XML組態檔的混合配置的,比如,我們可把Player類的配置資訊放在player-config.xml里:
1 <beans /* 省略命名空間和XSD模式檔案宣告 */> 2 <bean id="player" class="com.dream.Player"> 3 <constructor-arg type="com.dream.Music" ref="music" /> 4 </bean> 5 </beans>
把Music類的配置資訊放在MusicConfig配置類里:
1 @ComponentScan 2 public class MusicConfig { 3 @Bean("music") 4 public Music produceMusic() { 5 return new Music("Dream"); 6 } 7 }
之后通過@ImportResource注解把player-config.xml和MusicConfig配置類混合匯入AppConfig配置類里:
1 @Configuration 2 @Import(value = https://www.cnblogs.com/evanlin/p/MusicConfig.class) 3 @ImportResource(value = https://www.cnblogs.com/evanlin/p/{"classpath:com//dream//player-config.xml"}) 4 public class AppConfig { 5 }
<import>元素與XML組態檔的匯入
和Java配置類能匯入其它Java配置類一樣,XML組態檔也能匯入其它XML組態檔,比如,我們可把Music類的配置資訊放在music-config.xml里:
1 <beans /* 省略命名空間和XSD模式檔案宣告 */> 2 <bean id="music" class="com.dream.Music"> 3 <constructor-arg type="java.lang.String" value="Dream" /> 4 </bean> 5 </beans>
把Player類的配置資訊放在player-config.xml里:
1 <beans /* 省略命名空間和XSD模式檔案宣告 */> 2 <bean id="player" class="com.dream.Player"> 3 <constructor-arg type="com.dream.Music" ref="music" /> 4 </bean> 5 </beans>
之后可在app-config.xml里這樣匯入XML組態檔:
1 <beans /* 省略命名空間和XSD模式檔案宣告 */> 2 <import resource="classpath:com/dream/music-config.xml" /> 3 <import resource="classpath:com/dream/player-config.xml" /> 4 </beans>
XML組態檔是由<import>元素匯入的,<import>元素有個resource屬性,用于指定即將匯入的XML組態檔的路徑,這里,app-config.xml組態檔通過<import>元素匯入了music-config.xml和player-config.xml兩個組態檔,
<bean>元素與Java配置類的匯入
往XML組態檔里匯入Java配置類有點特別,需要做好兩件事情:
1.啟用基于注解的配置,告訴Spring容器需要決議諸如@Configuration之類的注解,
2.往XML組態檔里添加Java配置類的Bean,以使Spring容器能夠加載Java配置類,匯入Java配置類,
比如,我們可把Player類的配置資訊放在PlayerConfig配置類里:
1 @Configuration 2 public class PlayerConfig { 3 @Bean("player") 4 public Player producePlayer(Music playingMusic) { 5 return new Player(playingMusic); 6 } 7 }
把Music類的配置資訊放在music-config.xml組態檔里:
1 <beans /* 省略命名空間和XSD模式檔案宣告 */> 2 <bean id="music" class="com.dream.Music"> 3 <constructor-arg type="java.lang.String" value="Dream" /> 4 </bean> 5 </beans>
之后可在app-config.xml組態檔里這樣混合匯入Java配置類和XML組態檔:
1 <beans /* 省略命名空間和XSD模式檔案宣告 */> 2 <context:annotation-config /> 3 4 <bean class="com.dream.PlayerConfig" /> 5 <import resource="classpath:com/dream/music-config.xml" /> 6 </beans>
為了匯入Java配置類,我們首先引入<context:annotation-config />元素啟用基于注解的配置,之后使用<bean />元素創建PlayerConfig型別的Bean,Spring容器創建PlayerConfig型別的Bean時,知道類上帶有@Configuration注解,是個配置類;于是加載該配置類進行Bean的創建,從而完成PlayerConfig配置類的匯入,
至此,關于混合配置的介紹也就告一段落了,下章,我們將會開始介紹Profile,歡迎大家繼續閱讀,謝謝大家!
回傳目錄 下載代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/450363.html
標籤:Java
上一篇:HashMap集合(鍵是String鍵值是String案例---鍵是Integer鍵值是String案例---鍵是String鍵值是Student---鍵是Student鍵值是String)
