百木园-与人分享,
就是让自己快乐。

混合配置

不知大家可曾想过这样一些问题:“在基于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。欢迎大家继续阅读,谢谢大家!

返回目录    下载代码


来源:https://www.cnblogs.com/evanlin/p/16065173.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 混合配置

相关推荐

  • 暂无文章