@PostConstruct 可以代替@Bean/@Produces 吗?

Can @PostConstruct be used as a substitute of @Bean/@Produces?

我在阅读 this post 时想到用简单的 [=14] 替换任何 @Bean (Spring DI) 或 @Produces (CDI) 的可能性=] 如以下 CDI 示例所示:

替换:

public class MyClassFactory {

    @Produces
    @RequestScoped
    public MyClass createMyClass() {
        MyClass myClass = new MyClass();
        myClass.setA(1);
        return myClass;
    }
}

public class MyClass {

    private int a;

    private void setA(int a) {
        this.a = a;
    }
}

有:

public class MyClass {

    @PostConstruct
    public void init() {
        this.setA(1);
    }

    private int a;

    private void setA(int a) {
        this.a = a;
    }
}

对吗?这些选项之间有什么区别?

不,@PostConstruct 为 bean 的初始化 定义了一个拦截器。它不能用于定义 bean 的实例化

我不认为这是一个错误的问题。

@PostConstruct 方法在默认构造函数调用和依赖注入(如果有)完成后被调用。您可以使用带有 @PostConstruct 注释的方法来初始化 bean 的实例变量。在这种情况下,使用@PostConstruct 和 CDI 的区别 b/w 是,CDI 返回的实例是上下文实例,因为它是 @RequestScoped,'produced' bean 的生命周期被限制在一个 HTTP要求。一旦现有的 HTTP 请求完成,就会生成一个新的 bean 实例。在@PostConstruct 的情况下,它是一个@Dependent 范围的 bean(默认情况下),它的生命周期将 'depend' 在注入它的 bean 上(使用 CDI @Inject)