Jakarta ee 基于条件注入@ejbbean
一个新手问题:我是否可以根据在属性文件中设置的条件注入不同的bean。以下是我想要实现的目标: 我在属性文件中设置了一些值。如果这是真的,那么我想Jakarta ee 基于条件注入@ejbbean,jakarta-ee,ejb,Jakarta Ee,Ejb,一个新手问题:我是否可以根据在属性文件中设置的条件注入不同的bean。以下是我想要实现的目标: 我在属性文件中设置了一些值。如果这是真的,那么我想 public class MyClass{ @EJB private MyBean bean; } 如果是假的,那么 public class MyClass{ @EJB private MyBean2 bean2; } 这可行吗?我认为您无法修改正在注入的bean的类型。我认为这是一种Java限制,因为它是一种
public class MyClass{
@EJB
private MyBean bean;
}
如果是假的,那么
public class MyClass{
@EJB
private MyBean2 bean2;
}
这可行吗?我认为您无法修改正在注入的bean的类型。我认为这是一种Java限制,因为它是一种强类型语言:) 但是,您可以使用多个bean实现同一接口的场景,并且您希望注入该接口的特定实现,如下所示:
@Local
public interface MyBean {
}
@Stateless
public class MyBeanImpl1 implements MyBean {
}
@Stateless
public class MyBeanImpl2 implements MyBean {
}
然后你可以做:
public MyClass {
@EJB(beanName="MyBeanImpl1")
MyBean myBean;
}
或
根据要注入的实现。正如Gonzalo所说,如果要将bean声明为类字段并使用不同的实现,首先需要指定bean的公共接口 此外,我认为使用CDI的@products方法可以实现更优雅的效果;i、 e.在这两条线之间:
@Singleton
@Startup
public class Configuration {
private boolean someCondition;
@PostConstruct
private void init() {
someCondition = ... // get a value from DB, JMS, XML, etc.
}
@EJB(lookup="java:comp/env/myParticularBean")
MyBean myBean1;
@EJB(beanName="anotherTypeOfBeanInjectedByName")
MyBean myBean2;
@Produces
public MyBean produceMyBean() {
if (someCondition)
return myBean1;
} else {
return myBean2;
}
}
}
然后在代码中,您可以只使用:
@Inject
MyBean myBean;
并根据您的情况为您注入合适的bean
如果您不需要类级别的字段,那么可以使用旧方法在JNDI中定位EJB——这样您就可以控制应该定位和使用什么类型和什么bean
编辑:我添加了带注释的@EJB
bean,以显示“myBean1”和“myBean2”实例可能来自何处
这个示例显示,您可以在一个单独的位置定义对不同EJB实现和其他组件的所有依赖关系。在一个例子中,这可以实现为带有@EJB字段、@PersistenceContext字段等的单例EJB
您可以将return myBean1
更改为类似return context.lookup(“JNDI\u NAMESPACE\u COORDINATES”)
的内容,其中context
是InitialContext
的实例
希望这能让问题更清楚。这不是一个很好的解决方案,因为如果您决定更改实现,您必须重新编译代码。实际上,@Neo要求基于条件的注入。不是人工选择的注射。谢谢你的建议。但是当返回类型为“MyBean”时,我不太明白如何返回“myBean1”或“myBean2”?你能告诉我更多的细节吗?myBean1和myBean2是实现MyBean的类的实例。我会更新这个问题来展示更多的代码谢谢PedroKowalski。那么哪个类应该有方法“public MyBean produceMyBean()”?@neo任何适合您的方法:-)如果您想使用
@EJB
,它可以是一个单例EJB,如示例所示。如果您喜欢手动使用JNDI查找,它可能是一个常规类。谢谢并查看示例-希望这次更清楚。执行JNDI查找将是一个可行的替代方案,产生相同的后条件,但在应用程序服务器之间迁移代码将很难,因为到EJB的默认JNDI路径不是标准化的。
@Inject
MyBean myBean;