@ImportResource 不工作
@ImportResource not working
我是 Spring 引导新手,我想实现简单的 Web 应用程序,它使用一些 Mustache 模板呈现 UI。
我写了一些 Spring 组件(控制器、DAO、服务),它们的包结构不同(不在与 Spring boor runner class 相同或子目录下)。所以我使用 @ImportResource
注释来声明 spring 配置。但是我的应用程序没有读取任何配置文件。
请参考下面的代码片段了解更多详情
- 项目结构:
这里不是那个,Spring 启动应用程序启动器 classes 写在包 SpringPropertyReaderApplication
.
中
ApplicationConfiguration
class 是在相同的分层包结构下编写的,它使用 @ImportResource
注释定义了更多配置。
- 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("------------------------------------------------");
}
}
- 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";
}
}
- 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。
我是 Spring 引导新手,我想实现简单的 Web 应用程序,它使用一些 Mustache 模板呈现 UI。
我写了一些 Spring 组件(控制器、DAO、服务),它们的包结构不同(不在与 Spring boor runner class 相同或子目录下)。所以我使用 @ImportResource
注释来声明 spring 配置。但是我的应用程序没有读取任何配置文件。
请参考下面的代码片段了解更多详情
- 项目结构:
这里不是那个,Spring 启动应用程序启动器 classes 写在包 SpringPropertyReaderApplication
.
ApplicationConfiguration
class 是在相同的分层包结构下编写的,它使用 @ImportResource
注释定义了更多配置。
- 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("------------------------------------------------"); } }
- 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"; } }
- 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。