使用cdi注入高速缓存的实例

时间:2012-11-01 19:03:31

标签: java java-ee cdi weld

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

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

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

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

@Inject
@CustomInject
FwObject obj;

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

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

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

使用生产者方法

也许,一切都取决于你需要什么,但扩展可能是最好的方法。如果您需要使用新范围(如果您使用的是JSF,则对话范围可能有效),您肯定需要创建扩展。

答案 1 :(得分:0)

我想我是通过创建自定义范围来解决它的。以下文章非常有用:

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

创建自定义范围注释。

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;
}