【发布时间】:2019-10-30 16:03:11
【问题描述】:
这个例子只是一个虚拟的例子来展示我遇到的问题,所以不要太着迷于用其他方法来解决这里的具体问题。我的问题更多是关于理解在 Spring 中解决某类问题的正确技术
假设我有一个托管 bean Info
@Component
public class Info {
private final String activeProfile;
private final Instant timestamp;
public Info(@Value("${spring.profiles.active}") String activeProfile) {
this.activeProfile = activeProfile;
this.timestamp = Instant.now();
}
}
这里的关键是 bean 需要 Spring 注入的东西(我的示例中的活动配置文件)以及每次创建 bean 时都会更改的东西(我的示例中的时间戳)。由于后者,我不能使用Singleton 范围。获取此类 bean 的新实例的正确方法是什么?
我目前拥有的是,bean 不是托管的(没有@Component,没有@Value),我有一个托管服务(控制器)调用常规@的构造函数987654327@ POJO 明确。类似的东西
@RestController
public class InfoRestController {
@GetMapping
public Info getInfo(@Value("${spring.profiles.active}") String activeProfile) {
return new Info(activeProfile);
}
}
这个解决方案的问题在于,它会将活动配置文件的知识泄露给控制器,只是为了将其传递给Info 的构造函数,而从概念上讲,控制器不应该知道构造 Info bean。这就是依赖注入的要点之一
我想到了一些可能的解决方案:
- 在控制器中引用
InfoFactoryFactoryBean,然后引用return factory.getObject();。但是我真的需要为这样一个简单的案例创建一个新类吗? - 有一个构造托管 bean 的
@Bean工厂方法。这仍然存在该方法显式实例化InfoPOJO的问题,因此它本身需要对其进行Spring注入。此外,这是完整的样板文件。
Info bean 的构造非常简单,我想在 Spring 中有一种更简单的方法可以实现这一点。有吗?
【问题讨论】:
标签: java spring spring-boot dependency-injection