在 Spring Boot 中通过 XML 定义 Bean

1、概览

在 Spring 3.0 之前,XML 是定义和配置 Bean 的唯一方法。Spring 3.0 引入了 JavaConfig,允许我们使用 Java 类配置 Bean。不过,如今有些项目仍然在使用 XML 配置文件。

本文将带你了解如何在 Spring Boot 应用中整合 XML 配置。

2、@ImportResource 注解

@ImportResource 注解可以导入一个或多个包含 Bean 定义的资源。

比方说,我们有一个包含 Bean 定义的 beans.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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
    <bean class="com.baeldung.springbootxml.Pojo">
        <property name="field" value="sample-value"></property>
    </bean>
</beans>

要在 Spring Boot 应用中使用它,可以使用 @ImportResource 注解,告诉它在哪里可以找到配置文件:

@Configuration
@ImportResource("classpath:beans.xml")
public class SpringBootXmlApplication implements CommandLineRunner {

    @Autowired 
    private Pojo pojo;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootXmlApplication.class, args);
    }
}

如上例,SpringBootXmlApplication 中注入的 Pojo 实例,来自于 beans.xml 中定义的 Bean。

3、访问配置属性

如何在 XML 配置文件中使用属性?比方说,我们要使用 application.properties 文件中声明的属性:

sample=string loaded from properties!

更新 beans.xml 中的 Pojo 定义,以包含 sample 属性:

<bean class="com.baeldung.springbootxml.Pojo">
    <property name="field" value="${sample}"></property>
</bean>

接下来,测试该 properties 是否被正确地加载了:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootXmlApplication.class)
public class SpringBootXmlApplicationIntegrationTest {

    @Autowired 
    private Pojo pojo;
    @Value("${sample}") 
    private String sample;

    @Test
    public void whenCallingGetter_thenPrintingProperty() {
        assertThat(pojo.getField())
                .isNotBlank()
                .isEqualTo(sample);
    }
}

不幸的是,这个测试会失败,因为默认情况下,XML 配置文件无法解析占位符。不过,我们可以通过加入 @EnableAutoConfiguration 注解来解决这个问题:

@Configuration
@EnableAutoConfiguration
@ImportResource("classpath:beans.xml")
public class SpringBootXmlApplication implements CommandLineRunner {
    // ...
}

此注解可启用自动配置并尝试配置 Bean。

4、建议

可以继续使用 XML 配置文件。但也可以考虑将所有配置转移到 JavaConfig 中,原因有以下几点。首先,在 Java 中配置 Bean 是类型安全的,因此可以在编译时捕获到类型错误。此外,XML 配置文件可能会非常庞大,因此很难维护。

5、总结

本文介绍了如何使用 XML 配置在 Spring Boot 应用中定义 Bean。


Ref:https://www.baeldung.com/spring-boot-xml-beans