【问题标题】:Is there a way of defining the order by which cdi is going to destroy instances?有没有办法定义 cdi 销毁实例的顺序?
【发布时间】:2021-05-06 16:27:04
【问题描述】:

我正在开发一个应用程序,其中注入了一些服务。应用程序关闭后,我想定义调用 destroy() 函数的顺序。

例如,“服务 A 需要在服务 B 之前关闭”。

有没有办法做这样的事情?

【问题讨论】:

  • 将服务引用放入TreeMap,键为销毁顺序。然后遍历树销毁每个服务,并在调用之间放入一个简短的wait()。或 ArrayList。
  • 只是因为我很好奇:您的destroy() 函数实际上是做什么的,为什么这些函数依赖于之前关闭的另一个服务?我一直认为 CDI 的主要目的之一是您不必担心这些事情。
  • @maio290 在这种情况下,我有一个管理对象列表的服务。我有其他人在此对象列表中请求并执行操作。关闭时,理想的情况是建立订单。老实说,这是一个“很高兴”,所以我正在调查情况。

标签: java cdi java-ee-7


【解决方案1】:

假设您有两个对象,AB,它们彼此之间没有任何关系,例如在 @Singleton 范围内(只是一个任意范围)。据我所知,当他们的生产 Beans' destroy() 方法将被调用时,没有明确的顺序:A 可以先被销毁,B 可以先被销毁。

假设现在你有这三个对象:

  1. A@Singleton 范围内(同样,任意范围)
  2. B@Dependent 范围内,注入到A
  3. C@Dependent 范围内,注入到B

在这种情况下,再次假设我们讨论的是自定义 bean 而不是托管 bean,C 将首先被销毁,然后是 B,然后是 A

据我所知,这是规范提供的唯一订购保证。

【讨论】:

  • 这个答案的总体思路是正确的,但是managed beancustom bean 的概念被滥用了。请参阅规范定义on managed beans。我不确定custom bean 是什么意思,因为它通常表示Bean 接口的自定义实现(然后通过可移植扩展注册)。
  • 我认为托管 bean 类在内部由 Bean 表示,其生产资料在内部由 Producersuch Producers' dispose() methods do nothing when destroy is called 表示。对于造成的误解,我深表歉意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2015-07-19
相关资源
最近更新 更多