Weld CDI 自定义范围中的种子值
Seed value in Weld CDI custom scope
来自 Guice 背景,我知道可以使用范围从范围中播种对象值。
scope.seed(Key.get(SomeObject.class), someObject);
我想可以通过注册一个从 AbstractBoundContext
中获取值的 Bean 来做到这一点,但是似乎很难找到仅从自定义范围中播种一个值的示例。我如何创建一个自定义范围来播种可以在其他地方注入的值?
编辑:
我目前正在使用以下解决方法,可以在进入范围时将其注入拦截器以设置 Configuration
,然后可以通过其线程本地提供程序注入。不过,我仍在寻找感觉不那么老套/与 Weld 中的 scope/scope 上下文系统更加集成的选项。
@Singleton
public class ConfigurationProducer {
private final InheritableThreadLocal<Configuration> threadLocalConfiguration =
new InheritableThreadLocal<>();
@Produces
@ActiveDataSet
public ConfigurationConfiguration() {
return threadLocalConfiguration.get()
}
public void setConfiguration(Configuration configuration) {
threadLocalConfiguration.set(configuration);
}
}
答案是使用 AfterBeanDiscovery 事件注册自定义 bean,如下所示:
event.addBean()
.createWith(ctx -> commandContext.getCurrentCommandExecution())
.addType(CommandExecution.class)
.addQualifier(Default.Literal.INSTANCE)
.scope(CommandScoped.class)
.beanClass(CommandExtension.class);
提供了一个非常复杂的示例
来自 Guice 背景,我知道可以使用范围从范围中播种对象值。
scope.seed(Key.get(SomeObject.class), someObject);
我想可以通过注册一个从 AbstractBoundContext
中获取值的 Bean 来做到这一点,但是似乎很难找到仅从自定义范围中播种一个值的示例。我如何创建一个自定义范围来播种可以在其他地方注入的值?
编辑:
我目前正在使用以下解决方法,可以在进入范围时将其注入拦截器以设置 Configuration
,然后可以通过其线程本地提供程序注入。不过,我仍在寻找感觉不那么老套/与 Weld 中的 scope/scope 上下文系统更加集成的选项。
@Singleton
public class ConfigurationProducer {
private final InheritableThreadLocal<Configuration> threadLocalConfiguration =
new InheritableThreadLocal<>();
@Produces
@ActiveDataSet
public ConfigurationConfiguration() {
return threadLocalConfiguration.get()
}
public void setConfiguration(Configuration configuration) {
threadLocalConfiguration.set(configuration);
}
}
答案是使用 AfterBeanDiscovery 事件注册自定义 bean,如下所示:
event.addBean()
.createWith(ctx -> commandContext.getCurrentCommandExecution())
.addType(CommandExecution.class)
.addQualifier(Default.Literal.INSTANCE)
.scope(CommandScoped.class)
.beanClass(CommandExtension.class);
提供了一个非常复杂的示例