【问题标题】:Inject value from properties in Spring Boot从 Spring Boot 中的属性注入值
【发布时间】:2017-07-18 17:51:40
【问题描述】:

我有一个 Rest Controller,我在其中初始化这样的服务:

class Config {
  @Value(${"number.of.books"})
  private final static String numberOfBooks;
}


class MyController  {

 private final Service myService = new ServiceImplementation(Config.numberOfBooks)

 public ResponseEntity methodA() { ... }

}

numberOfBooks 字段有一个初始化值,但是当它传入ServiceImplementation 构造函数时,它为空。

我想我在这里遗漏了一些明显的东西。

错误是什么?将属性文件中的值注入构造函数的最佳做法是什么?

【问题讨论】:

  • @Value("${number.of.books}"),我也不认为你可以这样声明为final。
  • 更新了 sn-p,从语法的角度来看,IDE 中的代码是正确的,因为 numberOfBooks 字段是使用属性文件中的值初始化的。构造函数将其读取为 null。
  • 我猜是初始化顺序的问题。如果你从字段中删除 static 关键字并在 MyController 中注入 Config 类,它可能会起作用。
  • 代码不正确。您正在尝试使用一个不起作用的私有字段,并且您不能声明一个未初始化为 final 的属性
  • @baao 你可以声明一个属性final,只要它在构造函数中设置。不过,static final 没有意义。

标签: java spring spring-mvc spring-boot dependency-injection


【解决方案1】:

我建议你直接在你的ServiceImplementation中注入numberOfBooks,如下:

public class ServiceImplementation implements Service {

  @Value("${number.of.books}")
  private String numberOfBooks;

}

否则静态变量使用setter injection,如下:

@Component
class Config {

 public static String numberOfBooks;

 @Value("${number.of.books}")
 public void setNumberOfBooks(String numberOfBooks) {
    numberOfBooks = numberOfBooks;
 }
}

【讨论】:

  • 您能告诉我们为什么您建议直接注入值吗?
【解决方案2】:

经过一番研究,我发现依赖注入发生在调用构造函数之后。据说使用的方法是在我的服务构造函数上使用 Autowired。

class ServiceImplementation implements Service {

private final String numberOfBooks;

@Autowired
private ServiceImplementation(Config config) {
this.numberOfBooks = config.getNumberOfBooks();
}

}

这样,Spring 会创建依赖树,并确保 Config 在注入时不为空。

【讨论】:

    猜你喜欢
    • 2018-10-15
    • 1970-01-01
    • 2020-07-13
    • 2019-06-04
    • 2017-03-18
    • 2018-01-04
    • 2015-12-26
    • 2017-08-23
    • 2019-03-18
    相关资源
    最近更新 更多