我在Spring Boot应用程序启动期间设置了一个bean。我正在尝试使用Rest端点更新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;
}
}
答案 0 :(得分:0)
您可以尝试使用ConfigurableApplicationContext.refresh()
刷新:
beanFactory.registerSingleton(point, dynamicPoint);
beanFactory.refresh();
但是会有副作用,例如重新利用现有单例,这可能导致您的应用程序停机或响应未发送回客户端。
您要实现的目标是非常不规范的。通过设计,在启动过程中处理单例bean定义。您应该重新考虑您的方法,不要动态创建单例bean。也许您需要一个请求或会话范围的bean?