Этот пример - всего лишь фиктивный пример, показывающий проблему, с которой я столкнулся, поэтому не слишком увлекайтесь альтернативными способами для решения конкретной проблемы здесь. Мой вопрос больше о понимании правильной техники для решения проблем типа Spring
Скажем, у меня есть управляемый компонент 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-компонент не управляемый (нет @Component
, нет @Value
), и у меня есть управляемая служба (Контроллер), которая вызывает конструкторобычный Info
POJO явно. Что-то вроде
@RestController
public class InfoRestController {
@GetMapping
public Info getInfo(@Value("${spring.profiles.active}") String activeProfile) {
return new Info(activeProfile);
}
}
Проблема с этим решением заключается в том, что оно передает информацию об активном профиле контроллеру просто для того, чтобы передать его конструктору Info
, когда концептуально контроллер не должен знать опостроение информационного компонента. Это одна из точек внедрения зависимости
Я подумал о некоторых возможных решениях:
- Имеем ссылку на
InfoFactory
FactoryBean в контроллере итогда return factory.getObject();
. Но действительно ли мне нужно создавать новый класс для такого простого случая? - Есть фабричный метод
@Bean
, который создает управляемый компонент. По-прежнему существует проблема, заключающаяся в том, что метод явно создает экземпляр Info
POJO, поэтому самому ему необходимо выполнить инъекцию Spring. Кроме того, это полный шаблон.
Конструкция боба Info
настолько тривиальна, что я думаю, что есть более простой способ сделать это весной. Есть ли?