我目前正致力于CDI扩展。我必须注册一些特殊的自定义bean,这就是为什么生产者是不够的。
目前在AfterBeanDiscovery
阶段内完成此操作,方法是使用Bean<>
方法注册abd.addBean()
的自定义实施。
缺点是在bean的create()
- 方法内部我无法访问InjectionPoint
,这可能包含注释中的其他配置。
作为一种可能性,我可以在ProcessInjectionTarget
阶段收集我需要的所有bean(因为我可以访问注释)并在AfterBeanDiscovery
阶段内注册每个bean。
然后我必须使配置注释成为限定符和限定符绑定的属性(不使用@Nonbinding
)以防止出现依赖关系。
然后我会注册大量的bean,这些bean的配置不同。
有替代解决方案吗?是否可以访问bean InjectionPoint
方法中的create()
?
谢谢!
答案 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();
}
}