我试图从将Thread扩展到configuration.properties的类中外部化一些值,但是这些值未更新,这是我使用的示例:
@Component
@Scope("prototype")
public @interface ScheduledJob {..}
@configuration
@PropertySource("classpath:application.properties")
public class Classname extends Thread {
@Autowired
@Value("${sleep.sampling.s}")
private static int sleep;
}
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
你能帮忙吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Spring框架中,使用@Value
注解注入属性值到静态字段是不被支持的。@Value
主要用于实例字段的注入,而静态字段在Spring容器初始化时可能还未完成依赖注入。为了实现你的需求,你可以采用以下几种方式:
@PostConstruct
方法初始化静态变量虽然直接注入到静态字段不可行,但你可以在类初始化后通过一个非静态的@PostConstruct
方法来设置静态变量的值。
@Component
public class Classname extends Thread {
private static int sleep;
@Value("${sleep.sampling.s}")
private int sleepInstance;
@PostConstruct
public void init() {
Classname.sleep = this.sleepInstance;
}
}
Environment
获取配置另一种方法是通过注入Environment
接口来获取配置属性。
@Component
public class Classname extends Thread {
private static int sleep;
@Autowired
private Environment env;
@PostConstruct
public void init() {
sleep = Integer.parseInt(env.getProperty("sleep.sampling.s"));
}
}
创建一个配置类,专门用于持有这些配置属性,并以非静态的方式注入,然后在需要的地方引用这个配置类的实例。
@ConfigurationProperties(prefix = "sleep")
public class SleepConfig {
private int samplingS;
// getters and setters
}
@Configuration
@EnableConfigurationProperties(SleepConfig.class)
public class AppConfig {
// ...
}
@Component
public class Classname extends Thread {
@Autowired
private SleepConfig sleepConfig;
private int sleep;
@PostConstruct
public void init() {
sleep = sleepConfig.getSamplingS();
}
}
application.properties
文件的位置正确,并且Spring Boot能够找到它。spring-boot-starter-configuration-processor
的依赖(如果使用了@ConfigurationProperties)以便于IDE识别配置属性。以上方法应该能帮助你成功地从配置文件外部化并读取属性值。