使用 SpringApplication 时加载 applicationcontext.xml

Posted

技术标签:

【中文标题】使用 SpringApplication 时加载 applicationcontext.xml【英文标题】:Loading applicationcontext.xml when using SpringApplication 【发布时间】:2015-03-20 18:38:42 【问题描述】:

谁能提供一个加载 applicationContext.xml 文件的 SpringApplication 示例?

我正在尝试使用 Spring's Example(基于 Gradle)将我的 GWT RPC 应用程序移动到 RESTful Web 服务。我有一个 applicationContext.xml 但我看不到如何让 SpringApplication 加载它。通过手动加载

ApplicationContext context = new ClassPathXmlApplicationContext(args);

导致一个空的上下文。 ...即使这样有效,它也会与返回的那个分开

SpringApplication.run(Application.class, args);

或者有没有办法让外部 bean 进入 SpringApplication.run 创建的应用上下文?

【问题讨论】:

【参考方案1】:

如果您想使用类路径中的文件,您可以随时这样做:

@SpringBootApplication
@ImportResource("classpath:applicationContext.xml")
public class ExampleApplication 
    public static void main(String[] args) throws Exception 
        SpringApplication.run(ExampleApplication.class, args);
    

注意@ImportResource 注释中的classpath 字符串。

【讨论】:

【参考方案2】:

您可以使用@ImportResource 将 XML 配置文件导入您的 Spring Boot 应用程序。例如:

@SpringBootApplication
@ImportResource("applicationContext.xml")
public class ExampleApplication 

    public static void main(String[] args) throws Exception 
        SpringApplication.run(ExampleApplication.class, args);
    


【讨论】:

【参考方案3】:

注解不必是(在类上)那个(有主方法)那个(有下面的调用):

SpringApplication.run(Application.class, args);

(在你的情况下,我的意思是 @ImportResource 不必在你的班级)

公共类 ExampleApplication

…………

你可以有不同的班级

@Configuration
@ImportResource("classpath*:applicationContext.xml")
public class XmlConfiguration 

为了清楚起见

@Configuration
@ImportResource("classpath*:applicationContext.xml")
public class MyWhateverClassToProveTheImportResourceAnnotationCanBeElsewhere 

以上内容在本文中有所提及

http://www.springboottutorial.com/spring-boot-java-xml-context-configuration

…………

奖金:

以防万一您可能认为“SpringApplication.run”是一个无效方法.....事实并非如此。

您也可以这样做:

public static void main(String[] args) 

        org.springframework.context.ConfigurableApplicationContext applicationContext = SpringApplication.run(ExampleApplication.class, args);

        String[] beanNames = applicationContext.getBeanDefinitionNames();
        Arrays.sort(beanNames);

        for (String name : beanNames) 
            System.out.println(name);
        

这也将巧妙地引导您了解所有许多、许多、许多(我提到“许多”吗?)....spring boot 带来的依赖项。根据您所说的对象,这是一件好事(其他人为我做了所有好事)或邪恶的事情(哇,这是我无法控制的很多依赖项)。

hashtag:sometimesLookBehindTheCurtain

【讨论】:

【参考方案4】:

感谢安迪,这使它非常简洁。然而,我的主要问题是让 applicationContext.xml 进入类路径。

显然,需要将文件放入 src/main/resources 才能将它们放入类路径(通过将它们放入 jar 中)。我试图设置刚刚被忽略的 CLASSPATH。在我上面的示例中,加载似乎静默失败。使用@ImportResource 导致它详细失败(这有助于我找到真正的原因)。

【讨论】:

以上是关于使用 SpringApplication 时加载 applicationcontext.xml的主要内容,如果未能解决你的问题,请参考以下文章

springBoot 自动配置原理

SpringBoot之SpringApplication

SpringBoot项目中SpringApplication都做了什么

springboot启动流程 简单流程来了

Springboot源码深度解析,方法解析,类加载解析,容器建立

Idea搭建SpringBoot时,SpringApplication.run报错