有什么方法可以销毁所有创建的特定类的会话作用域的bean(并在需要时让spring重新创建)?
例如,有2个用户访问该应用程序,然后每个用户都有1个bean。我想摧毁所有这两个豆子。
用例:
管理员正在更新菜单栏。菜单栏列表数据存储在会话作用域bean中。管理员的bean应该被销毁,菜单栏应该被更新。当然,其他菜单也应更新,因此其他bean也应销毁。
注1:不同的用户可能会看到不同的菜单,因此Bean是会话作用域的,而不是单例的。
注2:我不想使整个用户会话失效,而只是使那个bean失效
我发现this way破坏了当前的范围bean。但是我无法从其他会话中销毁bean。
((ScopedObject) myBean).removeFromScope();
非常感谢!
答案 0 :(得分:0)
销毁豆子并重新创建它们似乎太过分了,也有些混乱。
对于这种方法,我倾向于事件,Spring提供了Spring Event API(spring-context
依赖项)。
您可以在bean类中注入一个ApplicationEventPublisher
实例,该实例引发其他一些bean的状态更改,并且这些bean可以注册一个偶数侦听器(@EventListener(condition = "..."))
来读取此更改事件。
例如发布者:
@Component
public class PublisherBean{
private final ApplicationEventPublisher publisher;
@Autowired
public PublisherBean(ApplicationEventPublisher publisher) { ... }
public void createOrder(Order order) {
// ....
this.publisher.publishEvent(new OrderCreatedEvent(order));
}
}
订阅者/听众:
@Component
public class ListenerBean{
@EventListener(condition = "#creationEvent.awesome")
public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) {
...
}
}
您可能会看到更多信息here。