【问题标题】:ENUM bean created with a Spring-Factory but the @PostConstruct is never called使用 Spring-Factory 创建的 ENUM bean,但从未调用过 @PostConstruct
【发布时间】:2017-08-02 09:02:39
【问题描述】:

我有一个枚举:

public enum MyEnum {

    INSTANCE;

    @Autowired
    Regroupements regroupements;

    @PostConstruct
    public void initi()
    {
        System.out.println("---------- i am not called!");
    }

    private MyEnum() {
        System.out.println("---------- i am called!");
    }

}

还有一个弹簧工厂

@Component
public class MyEnumFactory implements FactoryBean<MyEnum>{

    @Override
    public MyEnum getObject() throws Exception {
        return MyEnum.INSTANCE;
    }

    @Override
    public Class<?> getObjectType() {
        return MyEnum.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

}

问题是: 当调用工厂的方法给我唯一的实例时, init() 方法永远不会被调用! 你会注意到,因为它是一个枚举,所以该类没有 @Component 注解。这就是我使用工厂的原因。

我想要的是启动一个post-construct,方式无关紧要。

【问题讨论】:

  • PostConstruct 注释用于需要在完成依赖注入以执行任何初始化后执行的方法,但在您的情况下,您使用的是 ENUM (MyEnum ),这无法实例化。所以 PostConstruct 将不工作@电极

标签: java spring enums singleton


【解决方案1】:

您不能将枚举用作 bean(通常您不必这样做),因此您既不能在其上使用 @PostConstruct,也不能在其中自动装配任何东西:您的依赖关系 Regroupements regroupements; 将是 @987654325 @。

【讨论】:

  • (1) 我不太明白,但我想了解更多:-)。事实上,我想通过 ENUM 方法使用模式单例,这是最佳实践,根据许多已确认的开发人员。对不对?
  • (2) 其次,要实例化我的类型 Regroupements(我的依赖 Regroupements regroupements;),我必须通过 applicationContext.getBean 方法来实现吗?对吗?
  • @electrode (1) Spring bean 已经(默认情况下)是单例的,如果这是您使用 Enums 的原因,那么您绝对不需要它们。 (2) 取决于你想做什么。我建议你了解一下 Spring you can start here 并提出更好的问题。
  • 好的@Oleg你是对的。事实上,我并没有真正理解 Spring 的范围概念。更清楚了。如果您有关于它们之间的范围和冲突的更好的文档,那就太好了..
  • @electrode 我之前给你的链接有一个关于范围的部分。如果您想了解更多详细信息,可以查看spring reference(唯一感兴趣的范围是单例,其他范围的原型仅与 SprigMVC 相关)。 “他们之间的冲突”是什么意思? Bean Scopes 没有冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2012-08-31
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多