导入和混合装配
在Spring应用中有隐式自动化装配,显式的java配置类 和 XML 装配,如果只选择一种方式可能不是最佳的方案,他们都有各自适合的场景。值得庆幸的是,在Spring中,这些装配方案都不是互斥的,我们可以混合使用几种方式,达到最佳的效果。
在 javaConfig 中引用XML配置
我们假设已经存在一个CDPlayerConfig配置类,配置了CD(CD唱片)和CDPlayer(CD播放器)的bean。但是我们觉得CDPlayerConfig配置太饱和有点笨重,想要对其进行拆分。我们可以以下有几种方案:
方案一:我们可以将CD单独拆分为一个CDConfig进行装配,然后在CDPlayerConfig类添加@Import注解将CDConfig导入。
@Configuration
@Import(CDConfig.class)
public class CDPlayerConfig {
@Bean
public CDPlayer cdPlayer(CD cd){
return new CDPlayer(cd);
}
}
或者采用一种更好的办法,我们不在CDPlayerConfig中导入,而是创建一个更高级别的SoundSystemConfig导入两个配置类,将他们组合到一起。
@Configuration
@Import({CDConfig.class,CDPlayerConfig.class})
public class SoundSystemConfig {
}
除了上面两种方式,我们还可以用XML来配置一部分bean,比如使用XML文件cd.xml配置CDImpl,在CDPlayerConfig中导入XML配置。
cd.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cd" class="com.abiao._02_Autowiring.CDImpl"/>
</beans>
CDPlayerConfig
@Configuration
@ImportResource("classpath:cd.xml")
public class CDPlayerConfig {
@Bean
public CDPlayer cdPlayer(CD cd){
return new CDPlayer(cd);
}
}
也可以cdPlayer也采用xml配置,使用Java配置类导入
cd-player.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cdPlayer" class="com.abiao._02_Autowiring.CDPlayer">
<constructor-arg ref="cd"/>
</bean>
</beans>
SoundSystemConfig
@Configuration
@ImportResource({"classpath:cd.xml","classpath:cd-player.xml"})
public class SoundSystemConfig {
}
诸如上面的这些情况都可以灵活的搭配使用,只要符合Spring装配的规则
在XML中引用JavaConfig配置
像上面描述的那样,在JavaConfig中我们可以对其进行拆分,也可以一部分引用xml配置,那如果我们最开始是XML配置呢,同理,我们对复杂的xml配置也可以进行拆分,将一个复杂的xml文件 cd-player.xml拆分CD bean到cd.xml中,然后在cd-player.xml中使用<import>导入 cd.xml
cd.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cd" class="com.abiao._02_Autowiring.CDImpl"/>
</beans>
cd-player.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="cd.xml"/>
<bean id="cdPlayer" class="com.abiao._02_Autowiring.CDPlayer">
<constructor-arg ref="cd"/>
</bean>
</beans>
当然我们也可以在xml配置中,使用javaConfig配置类,只需要将配置类装配为bean
cd-player.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.abiao._02_Autowiring.CDConfig"/>
<bean id="cdPlayer" class="com.abiao._02_Autowiring.CDPlayer">
<constructor-arg ref="cd"/>
</bean>
</beans>
同样的道理我们也可以定义一个顶层配置文件 sound-system.xml,里面不会配置bean,只会引用其他文件的配置
cd-player.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cdPlayer" class="com.abiao._02_Autowiring.CDPlayer">
<constructor-arg ref="cd"/>
</bean>
</beans>
sound-system.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.abiao._02_Autowiring.CDConfig"/>
<import resource="cd-player.xml"/>
</beans>
以上就是在Spring中,多种装配bean的方式混合使用的效果,这样我们就可以在不同场景选择适合的方式对bean进行装配。
每天进步一点点,越慢才能越快!