【问题标题】:Can @PostConstruct be used as a substitute of @Bean/@Produces?@PostConstruct 可以用作@Bean/@Produces 的替代品吗?
【发布时间】:2015-06-12 14:33:55
【问题描述】:

当我想到用简单的@PostConstructor 替换任何@Bean (Spring DI) 或@Produces (CDI) 时,我正在阅读this post,如下面的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;
    }
}

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

【问题讨论】:

    标签: java spring dependency-injection cdi postconstruct


    【解决方案1】:

    我不认为这是一个不正确的问题。

    @PostConstruct 方法在默认构造函数调用和依赖注入(如果有)完成后调用。您可以使用 @PostConstruct 带注释的方法初始化 bean 的实例变量。在这种情况下,使用 @PostConstruct 和 CDI 的黑白区别在于,CDI 返回的实例是上下文实例,并且由于它是 @RequestScoped,因此“生成”bean 的生命周期仅限于一个 HTTP 请求。一旦现有的 HTTP 请求完成,就会生成一个新的 bean 实例。对于@PostConstruct,它是一个@Dependent 范围的bean(默认情况下),它的生命周期将“依赖”注入它的bean(使用CDI @Inject)

    【讨论】:

    • 你是说替换没问题吗?我询问了@Produces/@Bean 方法和可能的@PostConstruct 方法之间的区别,而不是 Spring DI 和 CDI 之间的区别。对不起,如果我不清楚。
    【解决方案2】:

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

    【讨论】:

    • 糟糕。我的错。你说得对。抱歉这个疯狂的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-09-22
    • 2018-09-10
    • 2022-08-15
    • 2016-09-13
    • 1970-01-01
    • 2011-01-28
    • 2011-03-16
    • 2020-03-30
    相关资源
    最近更新 更多