我可以使用弹簧注入来注入枚举吗? [复制]

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 不应该是枚举。它应该是一个包含Carpartsenum 列表的类,例如CarTypeManufacturerType

【讨论】:

以上是关于我可以使用弹簧注入来注入枚举吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

可以使用 Microsoft Detours 来挂钩系统范围的调用而不注入每个 proc 吗?

模拟中的弹簧值注入

有啥方法可以在我的代码中注入 SQL 吗? [复制]

有啥方法可以在我的代码中注入 SQL 吗? [复制]

使用构造函数注入的弹簧@RestController中的空异常@Service

如何使弹簧将值注入静态字段