在Spring Boot启动期间实例化动态Bean更新

时间:2018-11-16 21:20:23

标签: spring spring-boot autowired spring-bean

我在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;
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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

您要实现的目标是非常不规范的。通过设计,在启动过程中处理单例bean定义。您应该重新考虑您的方法,不要动态创建单例bean。也许您需要一个请求或会话范围的bean?