Я использую аннотацию @PostContruct для инициализации некоторых данных в @Component с помощью spring.
Проблема в том, что свойство инициализируется только один раз. Код внутри @Component выглядит примерно так.
private int x;
@Inject Repository myRepo;
@PostConstruct
private void init () {
this.x = myRepo.findAll().size();
}
Переменная «x» будет инициализирована при сборке, и если мои данные изменятся в моей БД, «x не будет обновляться. Есть ли способ, которым я мог бы внедрить службу в класс, не принадлежащий Spring? Без @Component, для пример.
MyClass newclass = new MyClass();
Итак, findAll () всегда будет вызываться при инициализации класса.




Если вы это сделаете
@Component
@Scope('prototype') // thats the trick here
public class MyClass(){
@Autowired Repository myRepo;
@PostConstruct
private void init () {
this.x = myRepo.findAll().size();
}
}
Экземпляры bean-компонента с областью видимости prototype создаются каждый раз, когда они запрашиваются с помощью определенного контекста CDI или когда они запрашиваются напрямую с завода.
В качестве альтернативы вы можете сделать
@Component()
public class MyClass(){
public MyClass(@Autowired Repository myRepo){
this.x = myRepo.findAll().size();
}
}
В обоих случаях вам придется использовать Spring CDI для получения нового экземпляра MyClass.
Что вы имеете в виду, когда говорите «используйте Spring CDI для получения нового экземпляра MyClass»?
Это означает, что либо с помощью @Autowired, либо с помощью BeanFactory.getBean(MyClass.class);
Если требуется изменить состояние объекта на основе состояния базы данных, то
@PostContructне является решением. Проверить объем прототипа