Динамическое обновление bean-компонента после его создания во время запуска Spring Boot - PullRequest
0 голосов
/ 17 ноября 2018

Я устанавливаю bean-компонент во время запуска приложения весенней загрузки.Я пытаюсь обновить компонент, используя конечную точку отдыха.Конечная точка в контроллере вызывает updatePoints () .Когда я получаю данные, используя точку GET, у нее все еще остаются только данные, которые были созданы во время запуска.В бине нет обновленных данных.

@Component
public class DynamicEntry{

private Map<String, DynamicPoint> dynamicPoints = new HashMap<>();
private DefaultListableBeanFactory beanFactory;

@Autowired
public DynamicEntry(DefaultListableBeanFactory beanFactory){
    this.beanFactory = beanFactory;
}

@PostConstruct
 void loadPoints(){
        //load the dynamicPoints after the spring boots up
}

void updatePoints(String point){
try {
     if (!dynamicPoints.containsKey(point)) {
                DynamicPoint dynamicPoint = new DynamicPoint(point);
                beanFactory.registerSingleton(point, dynamicPoint);
                dynamicPoints(point, dynamicPoint);
}
} catch (Exception | Error e) {
            e.printStackTrace();
}
}

@Bean
    public Map<String, DynamicPoint> dynamicPoints() {
        return dynamicPoints;
    }
}

1 Ответ

0 голосов
/ 17 ноября 2018

Вы можете попробовать обновить с помощью ConfigurableApplicationContext.refresh():

beanFactory.registerSingleton(point, dynamicPoint);
beanFactory.refresh();

, но будут побочные эффекты, например воссоздание существующих синглетонов, которые могут привести к простою приложения или к тому, что ответ не будетотправлено обратно клиенту.

То, что вы пытаетесь достичь, очень нестандартно.По определению, определения одиночных бинов обрабатываются во время запуска.Вы должны переосмыслить свой подход и не создавать синглтон-бины на лету.Может быть, вам нужен запрос или сессионный компонент?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...