【问题标题】:Inject cached instances using cdi使用 cdi 注入缓存的实例
【发布时间】:2012-11-01 19:03:30
【问题描述】:

我想使用 @Inject 向 CDI 应用程序公开由外部框架管理的实例。这些实例必须由其他框架提供,因为它们的生命周期基于各种缓存策略。

例如:同一个实例在同一个线程范围内可见,可能存在于许多请求范围内,会话范围不适用。似乎我需要定义一个针对这类实例的新范围?

最好的方法是什么?扩展,是否可以使用生产者方法?

我几乎可以使用以下方法使用生产者方法:

@Inject
@CustomInject
FwObject obj;

@Produces
@CustomInject
FwObject createConfig(InjectionPoint p) {
  return (FwObject) ctx.get((Class<?>) p.getType());
}

但这迫使我明确生成的类型,这是不可能的,因为没有通用的框架接口。

任何帮助表示赞赏。

【问题讨论】:

    标签: java jakarta-ee cdi weld


    【解决方案1】:

    也许 使用生产者方法,一切都取决于您的需要,但扩展可能是最好的方法。如果您需要使用新范围(如果您使用 JSF,则对话范围可能会起作用),您当然需要创建一个扩展。

    【讨论】:

    • 感谢您的回答。我尝试了使用 InjectionPoint 检查的生产者方法,但认为这是一条死胡同。我还没有找到很多关于创建新范围的文档。你知道有什么推荐的读物吗?还是我要深入研究weld的源代码?
    • Weld 的文档中有一些内容。 OWB 可能还有一些其他的东西。 CODI 也有几个范围可供您查看。
    • 谢谢。想我想出了更大的图景。我将查看源以填写详细信息。干杯!
    【解决方案2】:

    我想我通过创建自定义范围解决了这个问题。下面的文章真的很有帮助:

    这是我如何解决它的非常简短的描述。

    创建自定义范围注释。

    import javax.enterprise.context.NormalScope;
    @Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE, ElementType.METHOD })
    @NormalScope
    public @interface CustomScope {
    }
    

    创建自定义上下文。

    import javax.enterprise.context.spi.Context;
    public class CustomContext implements Context {
      private MyFw myFw = .... ;
    
      @Override
      public Class<? extends Annotation> getScope() {
        return CustomScope.class;
      }
      @Override
      public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext) {
        Bean bean = (Bean) contextual;
        return (T) myFw.get(bean.getBeanClass());
      }
      @Override
      public <T> T get(Contextual<T> contextual) {
        Bean bean = (Bean) contextual;
        return (T) myFw.get(bean.getBeanClass());
      }
      @Override
      public boolean isActive() {
        return true;
      }
    }
    

    创建扩展并注册上下文。

    import javax.enterprise.inject.spi.Extension;
    public class CustomContextExtension implements Extension {
      public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager manager) {
        event.addContext(new CustomContext());
      }
    }
    

    注册扩展。

    将 CustomContextExtension 添加到 META-INF/javax.enterprise.inject.spi.Extension

    将 CustomScope 添加到框架对象。

    @CustomScope
    public class FwObject { ... }
    

    在需要时使用@Inject 注入 FwObject。

    public class MyService {
      @Inject
      FwObject obj;
    }
    

    【讨论】:

    • 链接失效了,你能找到其他途径吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 2023-03-10
    • 1970-01-01
    • 2013-03-05
    • 2016-07-25
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多