CDI作为工厂?
CDI as a factory?
我的 JAX-RS 上有这个端点 Java EE 应用程序:
public class SearchEndpoint implements ISearchEndpoint
{
@Inject protected SearchService searchService;
@Override
public Response search()
{
return Response.ok().entity(this.searchService.search()).build();
}
}
在searchService's search
方法中:
public class SearchService {
@Inject private QueryVisitor visitor;
public List<?> search() {
for (Expression<?> group : groups)
group.accept(this.visitor);
}
}
然后在QueryVisitor
,
@Override
public ESEntityPathPointer<?> visit(Expression<?> expr, ESEntityPathPointer<?> context) {
switch ((EntityType)expr.getMetadata().getElement())
{
case digitalInput:
if (context == null)
context = new DigitalInputESEntityPathPointer();
break;
case followUpActivity:
if (context == null)
context = new FollowUpActivityESEntityPathPointer();
break;
case ...;
}
return context;
}
因此,CDI 在我的 JAX-RS 端点实现中注入了一个 SearchService
,然后 CDI 在之前注入的 SearchService
.
中注入了一个 QueryVisitor
所以,正如您基本猜到的那样,QueryVisitor.visit
充当工厂。根据 EntityType
枚举值,它创建一个 ESEntityPathPointer<?>
对象或另一个对象。
我希望这些对象是使用 CDI 创建的。
我已经阅读了一些相关内容,但我不太清楚如何执行此操作。
有什么想法吗?
尝试以下操作:
SomeBean bean = CDI.current().select(SomeBean.class).get();
使用限定符?尝试以下操作:
SomeBean bean = CDI.current().select(SomeBean,
new AnnotationLiteral<Qualifier1>(){},
new AnnotationLiteral<Qualifier2>(){}).get();
我的 JAX-RS 上有这个端点 Java EE 应用程序:
public class SearchEndpoint implements ISearchEndpoint
{
@Inject protected SearchService searchService;
@Override
public Response search()
{
return Response.ok().entity(this.searchService.search()).build();
}
}
在searchService's search
方法中:
public class SearchService {
@Inject private QueryVisitor visitor;
public List<?> search() {
for (Expression<?> group : groups)
group.accept(this.visitor);
}
}
然后在QueryVisitor
,
@Override
public ESEntityPathPointer<?> visit(Expression<?> expr, ESEntityPathPointer<?> context) {
switch ((EntityType)expr.getMetadata().getElement())
{
case digitalInput:
if (context == null)
context = new DigitalInputESEntityPathPointer();
break;
case followUpActivity:
if (context == null)
context = new FollowUpActivityESEntityPathPointer();
break;
case ...;
}
return context;
}
因此,CDI 在我的 JAX-RS 端点实现中注入了一个 SearchService
,然后 CDI 在之前注入的 SearchService
.
QueryVisitor
所以,正如您基本猜到的那样,QueryVisitor.visit
充当工厂。根据 EntityType
枚举值,它创建一个 ESEntityPathPointer<?>
对象或另一个对象。
我希望这些对象是使用 CDI 创建的。 我已经阅读了一些相关内容,但我不太清楚如何执行此操作。
有什么想法吗?
尝试以下操作:
SomeBean bean = CDI.current().select(SomeBean.class).get();
使用限定符?尝试以下操作:
SomeBean bean = CDI.current().select(SomeBean,
new AnnotationLiteral<Qualifier1>(){},
new AnnotationLiteral<Qualifier2>(){}).get();