我很抱歉问这个显而易见的问题,但是你怎么知道 @Value 注释不起作用?Spring 工作方式的问题之一是 Bean 的预处理是在构建 Bean 之后进行的。
因此,如果您使用调试器在构造函数中检查 Bean,您将看不到正在设置的字段。您可以在 Bean 中添加一个名为 audit() 的方法,并使用 @PostConstruct 对其进行注释,如果您在其中放置日志语句,在其上放置断点,您应该会看到带有 @Value 值的字段。
如果你这样做了,但你仍然看不到你的 @Value 字段,那么你甚至可能没有扫描过 Bean。你认为实现 Bean 的类仍然是一个 Java 类,它可以被实例化,并且如果它没有被预处理,它的字段将被分配为空。
为了确保您的 Bean 正在被扫描,这些类应该至少具有 @Component,并且您需要将类的包添加到 @ComponentScan。
@ComponentScan(basePackages = { "com.example.springboot", "org.bilbo.baggins" })
如果您没有 main() 方法的源代码,通常可以在其中找到 @ComponentScan,那么您可以在同一个包中添加一个 @Configuration 类,并在其中添加一个 @ComponentScan。
在此示例中,我将 @ComponentScan 作为注释掉的行放在错误的位置(它应该替换 @ImportResources)。
package com.example.springboot;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
// @ComponentScan(basePackages = { "com.example.springboot", "org.bilbo.baggins" })
@Configuration
@ImportResource({"classpath*:applicationContext.xml"})
public class Configurer {
}
我这样做是为了展示如何使用 XML 文件:applicationContext.xml。这包含一个组件扫描并创建一个 Bean。
(注意:声明只扫描一个包,component-scan 似乎是累积的。)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/sc
hema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/
beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema
/context/spring-context.xsd">
<context:annotation-config />
<context:component-scan base-package="org.bilbo.baggins" />
<bean id="applicationProperties"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="classpath:application.properties" />
</bean>
</beans>
在 XML 文件中构建一个 bean 很有用,这样您就可以列出它并证明您已经加载了 XML 文件。您可以使用该方法列出 beanString[] beanNames = ctx.getBeanDefinitionNames();