在 Spring 引导启动期间实例化后动态 bean 更新

Dynamic bean update once it has instantiated during the Spring Boot start up

我正在 spring 引导应用程序启动期间设置一个 bean。我正在尝试使用休息端点更新 bean。控制器中的终点调用 updatePoints()。当我使用 GET 点检索数据时,它仍然只有在启动期间实例化的数据。它在 bean 中没有更新的数据。

@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;
    }
}

您可以尝试使用 ConfigurableApplicationContext.refresh() 刷新:

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

但会有副作用,例如重新创建现有的单例,这可能会导致您的应用程序停机或无法将响应发送回客户端。

您要实现的目标非常不标准。按照设计,单例 bean 定义在启动期间进行处理。您应该重新考虑您的方法并且不要即时创建单例 bean。也许您需要一个请求或会话作用域的 bean?