Использование @PostContruct в Spring @Component для инициализации данных

Я использую аннотацию @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 () всегда будет вызываться при инициализации класса.

Если требуется изменить состояние объекта на основе состояния базы данных, то @PostContruct не является решением. Проверить объем прототипа

pvpkiran 23.07.2018 15:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
210
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы это сделаете

@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»?

Rafael Andrade 23.07.2018 16:16

Это означает, что либо с помощью @Autowired, либо с помощью BeanFactory.getBean(MyClass.class);

Antoniossss 23.07.2018 16:20

Другие вопросы по теме