【发布时间】:2021-02-05 14:00:06
【问题描述】:
这是我目前的工作代码:
public enum Year
{
year2021,
year2022;
}
_
public class Zoo
{
private Year year;
public Zoo(Year year)
{
this.year = year;
}
public int predictNumberOfAnimals() { ... }
}
_
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
public @interface YearAnnotation
{
String value();
}
_
public class Zoo2021 extends Zoo
{
@Inject
public Zoo2021(@YearAnnotation("y2021") Year year)
{
super(year);
}
@Produces @YearAnnotation("y2021")
public static Year getYear()
{
return Year.year2021;
}
}
_
public class Zoo2022 extends Zoo
{
@Inject
public Zoo2022(@YearAnnotation("y2022") Year year)
{
super(year);
}
@Produces @YearAnnotation("y2022")
public static Year getYear()
{
return Year.year2022;
}
}
然后这个工作:
public class Client
{
@Inject
private Zoo2022 zoo2022;
@Inject
private Zoo2021 zoo2021;
}
但是,我不喜欢为每个新的Year 创建一个Zoo 的子类。假设不能将Year 作为参数传递给predictNumberOfAnimals。
是否可以避免子类化并执行以下操作?:
public class Zoo
{
private Year year;
@Inject
public Zoo(Year year)
{
this.year = year;
}
public int predictNumberOfAnimals() { ... }
}
_
pulic class Client
{
@Inject @YearAnnotation("y2021") // <- (*)
private Zoo zoo2021;
@Inject @YearAnnotation("y2022") // <- (*)
private Zoo zoo2022;
@Produces @YearAnnotation("y2021")
public static Year getYear2021()
{
return Year.year2021;
}
@Produces @YearAnnotation("y2022")
public static Year getYear2022()
{
return Year.year2022;
}
}
使用(*) 处的@YearAnnotation 注释我想表明,在创建相应的Zoo 实例时,应注入相应的(不同的)年份(通过Zoo 的构造函数)。我的想法是以某种方式将@Produces 方法绑定到实例变量。
这样的事情可能吗?
【问题讨论】:
标签: java dependency-injection cdi