@ImportResource 不起作用

Gun*_*hah 4 java spring mustache spring-boot

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

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

请参阅下面的代码片段了解更多详细信息

  1. 项目结构:

在此输入图像描述

这里不是说, Spring boot 应用程序启动器类编写在 package 中SpringPropertyReaderApplication

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

  1. Spring Boot 应用程序启动器类。

包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("------------------------------------------------");
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. ApplicationConfiguration 类,我在其中共享其他 Spring 配置文件的位置。

包 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";
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 容器未加载 Spring 应用程序配置。

在这里,我添加了组件扫描注释来扫描与 Spring 启动器类不在同一包中的服务和控制器。

<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>
Run Code Online (Sandbox Code Playgroud)

我已添加代码来记录 Spring boot 加载的所有 bean 名称。但我没有找到任何名称为“xmlStringBean1”和“myController”的bean。

另请注意,如果我将 Rest 控制器和其他类放在与 Spring boot 启动器类相同的包层次结构下,则此应用程序可以正常工作。

Him*_*waj 5

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

@ImportResource(locations = {"classpath*:application-context.xml"})
Run Code Online (Sandbox Code Playgroud)

替换为

@ImportResource(locations = {"classpath:spring/application-context.xml"}) . 
Run Code Online (Sandbox Code Playgroud)

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