我希望使用@Inject将外部框架管理的实例公开给CDI应用程序。这些实例必须提供给其他框架,因为它们的生命周期基于各种缓存策略。
Ex:同一个实例在同一个线程范围内可见,可能存在于许多请求范围内,会话范围不适用。似乎我需要定义一个针对这类实例的新范围?
最好的方法是什么?扩展,是否可以使用生产者方法?
我几乎可以使用以下方法使用生产者方法:
@Inject
@CustomInject
FwObject obj;
@Produces
@CustomInject
FwObject createConfig(InjectionPoint p) {
return (FwObject) ctx.get((Class<?>) p.getType());
}
但这迫使我明确了所产生的类型,这是不可能的,因为没有通用的框架接口。
任何帮助表示感谢。
答案 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;
}