在Spring Boot启动期间实例化后,动态bean将进行更新



我正在春季启动应用程序期间设置一个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;
}
}

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

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

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

你想要达到的是非常不标准的。根据设计,单例bean定义在启动期间进行处理。您应该重新思考您的方法,不要随意创建单例bean。也许您需要一个请求或会话范围的bean?

最新更新