我可以使用弹簧注入来注入枚举吗? [复制]
Posted
技术标签:
【中文标题】我可以使用弹簧注入来注入枚举吗? [复制]【英文标题】:Can I use spring injection, for injecting into an enum? [duplicate] 【发布时间】:2018-11-03 01:35:25 【问题描述】:我正在尝试使用弹簧注入来注入枚举。像这样:
public enum Car
HONDA("Honda", "hondas")
@Inject
Carparts carparts;
@Override
public List<Carpart> getCarparts()
return carparts.getCarpartsListings();
;
//more logic here
我的 Carparts bean 在配置类中定义如下:
@Bean
@Singleton
public Carparts geCarparts()
return new Carparts();
但是不管我得到了 carparts 注入的空值。 任何帮助将不胜感激。
【问题讨论】:
我不确定这是否有效,但 if 有效,那么您必须使这个枚举至少成为一个组件 s.t.它被春天捡起来。这不是一个特别合格的答案,但您至少需要在要注入的类上使用@Component
annotation 之类的东西。
@StefanFalk 没有用“组件”注释一个类,这是另一种使该类成为 bean 的方法吗?我不知道一个类即使是注入也需要用“组件”注释。
@Component
告诉 Spring 这个类应该由 Spring 管理。 See this answer 了解更多细节,但本质是,如果您不告诉 Spring 处理某个类,Spring 将不会注入任何东西。
你想达到什么目的?告诉您的最终目标,我们可能会通过提供解决方法来帮助您。您不能注入枚举,因为枚举是静态的,并且注入过程是在枚举加载后发生的
您的Enum
不应包含逻辑。如果它包含逻辑,那么你的设计是错误的。重构逻辑部分。您测试具有静态方法的 util 类就足够了。
【参考方案1】:
您需要使用将成为 Spring 组件的内部静态类创建一个解决方法,注入它并为整个 Car EnumSet
设置 carparts
。
public enum Car
private Carparts carparts;
@Component
public static class CarPartsInjector
@Inject
private Carparts carparts;
@PostConstruct
public void construct()
for (Car car: EnumSet.allOf(Car.class))
car.setCarparts(carparts);
private void setCarparts(Carparts carparts)
this.carparts = carparts;
//...
总的来说,我认为这不是一个合适的解决方案。
这里的问题是数据模型。
Car
不应该是枚举。它应该是一个包含Carparts
、enum
列表的类,例如CarType
或ManufacturerType
。
【讨论】:
以上是关于我可以使用弹簧注入来注入枚举吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
可以使用 Microsoft Detours 来挂钩系统范围的调用而不注入每个 proc 吗?