无法在 Spring 中使用 @Value 从属性中获取值
Cannot get value from properties using @Value in Spring
我有一个使用 spring 的项目模板,我需要属性文件中的值,但是当我 运行 程序时,该值为空。这是我的代码:
属性文件包含:TOWN=Cluj
public class BaseTest {
@Value("${TOWN}")
public String stringValue;
@BeforeTest
public void beforeTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = context.getBean("studentBean", Student.class);
student.displayName();
student.displayTown();
System.out.println(stringValue); // -> this is null
}
}
Beans 文件:
<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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:property-placeholder location="classpath:stable.properties"/>
<context:component-scan base-package="com.base" />
<bean name="studentBean" class="com.model.Student">
<property name="name" value="MyName"/>
<property name="town" value="${TOWN}"/>
</bean>
</beans>
public class Student {
private String name;
private String town;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getTown() {
return town;
}
public void setTown(String town) {
this.town = town;
}
public void displayName(){
System.out.println("Name: " + name);
}
public void displayTown(){
System.out.println("Town: " + town);
}
}
在 BaseTest 中,当调用 displayTown(
) 方法时,属性文件中的值有效,但如果尝试将该值用作 BaseTest
中的变量,则值为空。
你能帮帮我吗?
正如您所确认的那样 BaseTest
只是一个正常的 class。不会自动注入值。
在xml
<context:property-placeholder location="classpath:stable.properties"/>
它会自动配置 PropertyPlaceholderConfigurer
,它会替换 ${}
占位符,这些占位符是根据指定的属性文件解析的。
<context:component-scan base-package="com.base" />
Scans the classpath for annotated components that will be
auto-registered as Spring beans. By default, the Spring-provided
@Component, @Repository, @Service, @Controller, @RestController,
@ControllerAdvice, and @Configuration stereotypes will be detected.
<bean name="studentBean" class="com.model.Student">
<property name="name" value="MyName"/>
<property name="town" value="${TOWN}"/>
</bean>
对于 Student
class name
和 town
字段将从 属性 文件
中自动选取
请注意,这只会发生在 Student
class。
您正在尝试的是在 BaseTest
class 中获取价值,这只是 class.
要么像这样定义一个 bean 为 BaseTest
class 注入 属性
<bean name="baseTestBean" class="classpath.BaseTest">
<property name="stringValue" value="${TOWN}"/>
</bean>
你在 class
中不需要 @Value("${TOWN}")
或
添加任何一个配置,它会自动扫描你的class,前提是它在com.base
包
下
我有一个使用 spring 的项目模板,我需要属性文件中的值,但是当我 运行 程序时,该值为空。这是我的代码: 属性文件包含:TOWN=Cluj
public class BaseTest {
@Value("${TOWN}")
public String stringValue;
@BeforeTest
public void beforeTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = context.getBean("studentBean", Student.class);
student.displayName();
student.displayTown();
System.out.println(stringValue); // -> this is null
}
}
Beans 文件:
<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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:property-placeholder location="classpath:stable.properties"/>
<context:component-scan base-package="com.base" />
<bean name="studentBean" class="com.model.Student">
<property name="name" value="MyName"/>
<property name="town" value="${TOWN}"/>
</bean>
</beans>
public class Student {
private String name;
private String town;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getTown() {
return town;
}
public void setTown(String town) {
this.town = town;
}
public void displayName(){
System.out.println("Name: " + name);
}
public void displayTown(){
System.out.println("Town: " + town);
}
}
在 BaseTest 中,当调用 displayTown(
) 方法时,属性文件中的值有效,但如果尝试将该值用作 BaseTest
中的变量,则值为空。
你能帮帮我吗?
正如您所确认的那样 BaseTest
只是一个正常的 class。不会自动注入值。
在xml
<context:property-placeholder location="classpath:stable.properties"/>
它会自动配置 PropertyPlaceholderConfigurer
,它会替换 ${}
占位符,这些占位符是根据指定的属性文件解析的。
<context:component-scan base-package="com.base" />
Scans the classpath for annotated components that will be auto-registered as Spring beans. By default, the Spring-provided @Component, @Repository, @Service, @Controller, @RestController, @ControllerAdvice, and @Configuration stereotypes will be detected.
<bean name="studentBean" class="com.model.Student">
<property name="name" value="MyName"/>
<property name="town" value="${TOWN}"/>
</bean>
对于 Student
class name
和 town
字段将从 属性 文件
请注意,这只会发生在 Student
class。
您正在尝试的是在 BaseTest
class 中获取价值,这只是 class.
要么像这样定义一个 bean 为 BaseTest
class 注入 属性
<bean name="baseTestBean" class="classpath.BaseTest">
<property name="stringValue" value="${TOWN}"/>
</bean>
你在 class
中不需要@Value("${TOWN}")
或
添加任何一个配置,它会自动扫描你的class,前提是它在com.base
包