【发布时间】:2019-08-06 08:51:44
【问题描述】:
所以我有一个抽象的 Java 类和一些实现(在我的例子中是 5 个)。
看起来像这样:
public abstract class AbstractAbst {
String someCommonString;
@Inject
Logger logger;
public AbstractAbst () {
}
public AbstractAbst (String someCommonString) {
this.someCommonString = someCommonString;
}
}
public class Abst1 extends AbstractAbst {
public Abst1() {
super();
}
public Abst1 (String someCommonString) {
super(someCommonString);
}
}
public class Abst2 extends AbstractAbst {
public Abst2 () {
super();
}
public Abst2 (String someCommonString) {
super(someCommonString);
}
}
// ... And 3 more
现在在我想使用这些类的班级中,我这样做:
public class AbstUser {
@Inject
Abst1 abst1;
@Inject
Abst2 abst2;
// ... And 3 more
public AbstUser () {
}
public doSomething {
abst1.someCommonString = "test";
abst2.someCommonString = "test";
// ... And 3 more
switch(someDecision) {
case 1:
abst1.doSomethingInAbst1();
break;
case 2:
abst1.doSomethingInAbst1();
break;
// ... And 3 more
}
}
}
但这不是最好的方法。不幸的是,我对 JavaEE 还很陌生,所以我想不出更好的方法。
我的问题:
- 有没有办法注入构造函数参数,这样我就可以
省略
abst1.someCommonString = "test"部分,因为它实际上 更多的体积,因为它不仅仅是一个参数。 - 我能以某种方式 注入抽象类并在运行时确定哪个 我想使用的实现?
【问题讨论】:
-
据我所知,你注入的类型需要在构造 bean 时解析。
-
@RobbyCornelissen 那么你会如何解决这样的问题呢?
-
没有足够的上下文来进行调用。使用提供的信息:不要注入任何东西,只需在运行时构造所需的类型。如果您还有其他方法可以确定需要注入的内容,可以查看
Instance。 -
我需要注入它,因为抽象类也注入了一些东西。或者你可以实例化一个注入某些东西的类的对象,而不注入那个类?
-
你可以使用
BeanManager来做类似的时髦的事情。
标签: jakarta-ee cdi