CDI扩展 - 如何处理限定符上的非绑定值

时间:2015-06-25 09:49:14

标签: java cdi

我目前正致力于CDI扩展。我必须注册一些特殊的自定义bean,这就是为什么生产者是不够的。

目前在AfterBeanDiscovery阶段内完成此操作,方法是使用Bean<>方法注册abd.addBean()的自定义实施。

缺点是在bean的create() - 方法内部我无法访问InjectionPoint,这可能包含注释中的其他配置。

作为一种可能性,我可以在ProcessInjectionTarget阶段收集我需要的所有bean(因为我可以访问注释)并在AfterBeanDiscovery阶段内注册每个bean。 然后我必须使配置注释成为限定符和限定符绑定的属性(不使用@Nonbinding)以防止出现依赖关系。

然后我会注册大量的bean,这些bean的配置不同。

有替代解决方案吗?是否可以访问bean InjectionPoint方法中的create()

谢谢!

1 个答案:

答案 0 :(得分:-1)

我想我找到了解决方案。

基本上我需要访问beans InjectionPoint方法中的当前create(),这样一来也可以访问注入点的注释。

要获取注入点,以下代码剪切工作(受OmniFaces启发,使用Apache Deltaspike):

public class InjectionPointGenerator {

  @Inject
  private InjectionPoint injectionPoint;

  public InjectionPoint getInjectionPoint() {
    return injectionPoint;
  }
}


public class BeanUtils {

  protected BeanUtils() {
    // Prevent instantiation
  }

  public static InjectionPoint getInjectionPoint(@Nonnull CreationalContext context) {
    Bean<InjectionPointGenerator> bean = getBean(InjectionPointGenerator.class);
    BeanManager beanManager = BeanManagerProvider.getInstance().getBeanManager();
    InjectionPoint injectionPoint = bean.getInjectionPoints().iterator().next();
    return (InjectionPoint) beanManager.getInjectableReference(injectionPoint, context);
  }

  private static <T> Bean<T> getBean(@Nonnull Class<T> type) {
    return BeanProvider.getBeanDefinitions(type, false, true).iterator().next();
  }
}