@ImportResource 不工作

@ImportResource not working

我是 Spring 引导新手,我想实现简单的 Web 应用程序,它使用一些 Mustache 模板呈现 UI。

我写了一些 Spring 组件(控制器、DAO、服务),它们的包结构不同(不在与 Spring boor runner class 相同或子目录下)。所以我使用 @ImportResource 注释来声明 spring 配置。但是我的应用程序没有读取任何配置文件。

请参考下面的代码片段了解更多详情

  1. 项目结构:

这里不是那个,Spring 启动应用程序启动器 classes 写在包 SpringPropertyReaderApplication.

ApplicationConfiguration class 是在相同的分层包结构下编写的,它使用 @ImportResource 注释定义了更多配置。

  1. Spring 启动应用程序启动器 class。

package com.example.launcher;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class SpringPropertyReaderApplication {

  public static void main(String[] args) {


      ApplicationContext applicationContext = SpringApplication.run(SpringPropertyReaderApplication.class, args);

      System.out.println("------------------------------------------------");
      System.out.println("-----Printing Bean Definition Names ------------");
      System.out.println("------------------------------------------------");
      for (String name : applicationContext.getBeanDefinitionNames()) {
          System.out.println(name);
      }
      System.out.println("------------------------------------------------");
      System.out.println("--------------------END------------------------");
      System.out.println("------------------------------------------------");
  }
}
  1. ApplicationConfiguration class 我在其中共享了其他 Spring 配置文件的位置。

package com.example.launcher.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource(locations = {"classpath*:application-context.xml"})
public class ApplicationConfiguration {

  @Bean
  public String someDummyBean1() {
      return "someDummyBean1";
  }
}
  1. Spring 容器未加载的应用程序配置。

在这里,我添加了组件扫描注释来扫描我的服务和控制器,它们与 Spring 启动器 class.

不在同一个包中
<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-2.5.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-2.5.xsd">


  <context:component-scan
      base-package="com.example" />

  <bean id="xmlStringBean1" class="java.lang.String">
      <constructor-arg value="stringBean1" />
  </bean>

</beans>

我添加了代码来记录所有由 Spring 引导加载的 bean 名称。但是我没有找到任何名称为 "xmlStringBean1" 和 "myController".

的 bean

另请注意,如果我将 Rest 控制器和其他 classes 置于与 Spring 启动启动器 class.[=21= 相同的包层次结构下,此应用程序工作正常]

我认为您的 spring 启动应用程序未检测到 class 注释为 @Configuration,因为默认情况下它会尝试查找配置 class与主 class 在相同或子包中。用 @ComponentScan 注释你的 SpringPropertyReaderApplication,像这样:

@SpringBootApplication
@ComponentScan(basePackageClasses = {ApplicationConfiguration.class})
public class SpringPropertyReaderApplication {
    // your code here
}

因为 application-context.xml 位于 src/main/resources 下的 spring 文件夹中。但是 ApplicationConfiguration.java 中定义的 @ImportResource 注释试图在根路径内扫描它。因此,未检测到该文件。

@ImportResource(locations = {"classpath*:application-context.xml"})

将替换为

@ImportResource(locations = {"classpath:spring/application-context.xml"}) . 

这将强制框架在 spring 目录(从根目录开始)中搜索 application-context.xml。