我应该将我的 XML bean 放在 Spring Boot 应用程序中的啥位置?

Posted

技术标签:

【中文标题】我应该将我的 XML bean 放在 Spring Boot 应用程序中的啥位置?【英文标题】:Where do I put my XML beans in a Spring Boot application?我应该将我的 XML bean 放在 Spring Boot 应用程序中的什么位置? 【发布时间】:2015-10-19 01:58:48 【问题描述】:

我正在重返 Spring(当前为 v4)。现在有了@SpringBootApplication 和其他注释,一切都很棒,但所有文档似乎都忘记提及我如何在 XML 中定义其他 bean!

例如,我想创建一个“SFTP 会话工厂”,定义如下: http://docs.spring.io/spring-integration/reference/html/sftp.html

有一些很好的 XML 来定义 bean,但是我到底应该把它放在哪里以及如何链接它呢?以前我做过:

ApplicationContext context = new ClassPathXmlApplicationContext(
                "classpath:applicationContext.xml");

指定文件名和位置,但现在我正在尝试使用:

ApplicationContext ctx = SpringApplication.run(Application.class);

我应该把 XML 文件放在哪里?有没有神奇的春天名字可以称呼它?

【问题讨论】:

【参考方案1】:

只要您从一个基本的@Configuration 类开始,这听起来像是@SpringBootApplication,您也可以使用@ImportResource 注释来包含一个XML 配置文件。

@SpringBootApplication
@ImportResource("classpath:spring-sftp-config.xml")
public class SpringConfiguration 
  //

【讨论】:

我是否必须将 @ImportResource 放在我编写的每个 Spring 应用程序和测试用例之上,或者是否有 Spring 自动查找的默认名称/位置? @DavidNewcomb 您只需要确保可以从您的配置根目录访问带有注释的配置类。如果它是你一直使用的东西,你甚至可以为它添加你自己的自动配置类。 @DavidNewcomb 你传统上只需要一个@SpringBootApplication 在你的应用程序中,因为它本身就是@Configuration 和其他一些必备项的组合。你的 @ImportResource 只需要在一个由 Spring 扫描的 @Configuration 类上,就像在 XML 领域发生/发生的自动扫描一样。 你拯救了我的一天。 我读到Spring Boot 非常擅长的一件事是使“配置”过程变得简单,并且可以在不涉及配置的情况下使用xml,但xml 可以加入通过应用@bvulaj 提到的配置过程。是否可以在不使用任何xml 的情况下完全配置我的应用程序?【参考方案2】:

您还可以将 XML 配置转换为 Java 配置。在您的情况下,它看起来像:

@Bean
public DefaultSftpSessionFactory sftpSessionFactory() 
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory();
    factory.setHost("localhost");
    factory.setPrivateKey(new ClassPathResource("classpath:META-INF/keys/sftpTest"));
    factory.setPrivateKeyPassphrase("springIntegration");
    factory.setPort(22);
    factory.setUser("kermit");
    return factory;

你可以把这个方法放在带有@SpringBootApplication注解的类中。

【讨论】:

【参考方案3】:

Spring boot 的理想概念是避免使用 xml 文件。但是如果你想保留xml bean,你可以添加@ImportResource("classPath:beanFileName.xml")

我建议删除spring-sftp-config.xml 文件。并且,将此文件转换为基于 spring 注释的 bean。所以,任何类都被创建为 bean。只需在类名前写@Service@Component 注释即可。例如:

基于 XML:

<bean ID="id name" class="com.example.Employee">

注释:

@Service or @Component
class Employee

然后,添加@ComponentScan("Give the package name")。这是最好的方法。

【讨论】:

问题是“如何链接现有的 xml 文件?”而不是“如何将我所有的 bean 转换为注释?”。你的答案和 bvulaj 的一样。 如果您支持注释与 xml,请添加这是一个 ~comment~。顺便说一句,并不是每个人都同意你的看法。 literatejava.com/spring/… #justSayin #notHatin 不。避免使用 XML 并不理想。我在 XML 上下文文件中的字符串 bean 中有 SQL、SAS 脚本、HTML 块,利用上下文变量替换功能。 添加@ImportResource("classpath:beanFileName.xml"),而不是@ImportResource("classPath:beanFileName.xml")

以上是关于我应该将我的 XML bean 放在 Spring Boot 应用程序中的啥位置?的主要内容,如果未能解决你的问题,请参考以下文章

Spring- Bean的命名

spring学习总结——装配Bean学习三(xml装配bean)

我应该将我的图像放在我的 iPhone 项目中的啥位置?

我应该将我的 Python 代码放在 SSD 而不是硬盘上吗?

CDI:beans.xml,我把你放在哪里?

Spring实战之通过XML装配bean