spring - 在 EJB 3.1 或 CDI 中定义并注入(inject)映射

标签 spring ejb cdi ejb-3.1

在 Spring 中开发了几年之后,我转向了 EJB,但我很不高兴的是我没有针对这个用例的解决方案。假设这是通过 map 实现的策略模式。在 Spring 中,它可能看起来像这样。

<bean id="myBean" class="MyBeanImpl">
    <property name="handlers">
        <map>
            <entry key="foo" value-ref="fooHandler"/>
            <entry key="bar" value-ref="barHandler"/>
        </map>
    </property>
</bean>

在 EJB/CDI 中,我有这个。

@Stateless
public class MyBeanImpl implements MyBean {

    private Map<String, Class<? extends Handler>> handlers = new HashMap<>();

    @PostConstruct
    public void init() {
        handlers.put("foo", FooHandlerImpl.class);
        handlers.put("bar", BarHandlerImpl.class);
    }

    //jndi lookup handlerClass.getSimpleName()

}

请注意,jndi 查找适用于实现,而不是接口(interface)。难道就没有更好的解决办法吗?不,我不想有单独的字段(foo,bar),注入(inject)它们并随后创建 map (它可能是巨大的列表并且经常更改)。理想情况下,如果发生任何配置更改,我根本不会触及 MyBeanImpl 类。

最佳答案

更像 CDI 的方式看起来像这样:

@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Handles {
    String value();
}


public class HandlerLiteral extends AnnotationLiteral<Handles> implements Handles{
    private final String value;
    public HandlerLiteral(String value) {
        this.value = value;
    }
    @Override
    public String value() {
        return value;
    }
}

然后,您可以使用 @Handles("someName") 注释每个 Handler 实现,例如您在此处使用的类名称。这里使用限定符更符合 CDI 的工作方式,并且我们使用内部 Instance 对象来解析适当的 bean。然后在您的服务代码(或任何地方)中您只需执行以下操作:

@Inject @Any
private Instance<HandlerService> handlerInstance;

...
handlerInstance.select(new HandlerLiteral("whateverName")).get().handle(context);

如果您确实只能使用 map ,那么这对您不起作用。但这应该允许更动态的注册,并且本质上会查看上下文中的每个处理程序。

关于spring - 在 EJB 3.1 或 CDI 中定义并注入(inject)映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25113624/

相关文章:

java - REST 端点 Spring Boot 中参数的自定义验证逻辑

Spring Autowiring ...将源类传递给 Autowiring 类

java - 有状态 EJB 与 session 属性

jakarta-ee - 是否可以在 CDI 中注入(inject)通用接口(interface)实现?

java - @Inject 字段始终为空

java - 身份验证失败: password does not match stored value (see update 2)

java - Spring并返回大量Json数据

java - EJB 和异步处理

jakarta-ee - 在 WildFly 中取消部署时,静态字段通常会被卸载吗?

jsf - 从 JSF @ManagedBean 迁移到 CDI @Named 后,多次调用构造函数并且提交的输入值始终为空