• 混合配置


    不知大家可曾想过这样一些问题:“在基于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 = { MusicConfig.class, PlayerConfig.class })
    3 public class AppConfig {
    4 }

    @Import注解有个Class<?>[]类型的value属性,能向它指定一个Class<?>类型的数组,导入多个Java配置类。因此,AppConfig配置类通过 @Import(value = { 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 = MusicConfig.class)
    3 @ImportResource(value = {"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 class="com.dream.PlayerConfig" />元素创建PlayerConfig类型的Bean。Spring容器创建PlayerConfig类型的Bean时,知道类上带有@Configuration注解,是个配置类;于是加载该配置类进行Bean的创建,从而完成PlayerConfig配置类的导入。

    至此,关于混合配置的介绍也就告一段落了。下章,我们将会开始介绍Profile。欢迎大家继续阅读,谢谢大家!

    返回目录    下载代码

  • 相关阅读:
    开学测试感想
    动手动脑1(00JAVA语言基础)
    9.29 java web注释方式以及servlet映射
    三十道随机算法
    9.30 servlet学习
    C#验证控件的使用方法
    SqlHelper详解
    C#字符串的几种常用方法
    存储过程事务处理
    js url编码
  • 原文地址:https://www.cnblogs.com/evanlin/p/16065173.html
Copyright © 2020-2023  润新知