阅读 103

Spring bean的装配-导入和混合装配

导入和混合装配

在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进行装配。

每天进步一点点,越慢才能越快!


文章分类
后端