标签: custom-scope

Spring 自定义范围生命周期 Bean 终止

问题:我如何告诉 Spring 一组具有自定义范围的 bean 都应该被视为垃圾,以便同一线程上的下一个请求不会重用它们的状态?

我所做的:我在 Spring 中实现了一个自定义范围,以模拟请求范围(HttpRequest)的生命周期,但对于 TcpRequests。它与此处找到的内容非常相似。

我发现的许多自定义范围的例子是原型或单例的变体,没有显式终止 bean,或者,它们基于本地线程或 ThreadScope,但它们没有描述告诉 Spring 生命周期已经结束并且所有豆类应该销毁。

我尝试过的事情(可能不正确):

  • 事件 + 侦听器指示作用域的开始和结束(这些发生在收到消息时和发送响应之前);在侦听器中,范围被明确清除,从而清除线程本地实现(scope.clear())使用的整个映射。在测试中手动处理时,清除范围确实会导致对 context.getBean() 的下一次调用返回一个新实例,但是我在单例类中自动装配的 bean 没有得到一个新 bean——它一遍又一遍地使用相同的 bean .

  • 实现:BeanFactoryPostProcessor、BeanPostProcessor、BeanFactoryAware、DisposableBean 并尝试在所有 Disposable bean 实例上调用 destroy() 的侦听器;类似这样的东西,但仅适用于我的自定义范围。这似乎失败了,因为没有明确结束 bean 的生命周期,尽管我在收到范围结束事件时调用 customScope.clear() ;结束范围似乎并不转化为“结束与此范围关联的所有 bean”。

  • 我已经广泛阅读了 Spring 文档,似乎很明显 Spring 不管理这些自定义 bean 的生命周期,因为它不知道何时或如何销毁它们,这意味着必须告诉它何时以及如何销毁摧毁他们;我试图阅读和理解 Spring 提供的 Session 和 Request 范围,以便我可以模仿这一点,但我遗漏了一些东西(同样,这些对我来说不可用,因为这不是一个网络感知应用程序,我不是使用 HttpRequests,这是我们应用程序结构的重大变化)

有没有人能够指出我正确的方向?

我有以下代码示例:

Xml 上下文配置

<int-ip:tcp-connection-factory id="serverConnectionFactory" type="server" port="19000" 
    serializer="javaSerializer" deserializer="javaDeserializer"/>

<int-ip:tcp-inbound-gateway id="inGateway" connection-factory="serverConnectionFactory"
    request-channel="incomingServerChannel" error-channel="errorChannel"/>

<int:channel id="incomingServerChannel" />

<int:chain input-channel="incomingServerChannel">
    <int:service-activator ref="transactionController"/> …
Run Code Online (Sandbox Code Playgroud)

java spring destruction spring-boot custom-scope

7
推荐指数
1
解决办法
1983
查看次数

Dagger 2 Kotlin - @Binds 方法的 @Named 限定符

我想为从@Binds 方法返回的对象使用@Named 限定符,但我注意到这只能通过静态提供方法实现,而我在实际实现中无法弄清楚。所以下面是我想要实现的。

我有一个自定义的 UserScope,它将包含用户登录后的所有活动/片段/视图模型,我在 AuthViewModelModule 中有 LoginViewModel,在 UserViewModelModule 中有另一个 VM 的 LeadViewModel,VMModule 都绑定了 VMProvider.Factory,因此我需要为VMFactory 实例,因此我可以在各自的活动/片段中注入 @Named 实例。

@Module
internal abstract class AuthViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(LoginViewModel::class)
    internal abstract fun bindLoginViewModel(loginViewModel: LoginViewModel): ViewModel

    @Binds
    internal abstract fun bindViewModelFactory(factory: AuthViewModelFactory):
        ViewModelProvider.Factory
}

@Module
internal abstract class UserViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(LeadViewModel::class)
    internal abstract fun bindLeadViewModel(leadViewModel: LeadViewModel): ViewModel

    @Binds
    internal abstract fun bindViewModelFactory(factory: UserViewModelFactory):
        ViewModelProvider.Factory
}
Run Code Online (Sandbox Code Playgroud)

kotlin dagger-2 custom-scope

2
推荐指数
1
解决办法
1352
查看次数