当我想到用@Bean
替换任何@Produces
(Spring DI)或@PostConstructor
(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;
}
}
这是对的吗?这些选项之间有什么区别?
答案 0 :(得分:1)
不,@PostConstruct
定义了bean的初始化的拦截器。它不能用于定义bean的实例化。
答案 1 :(得分:0)
我不认为这是一个不正确的问题。
在默认构造函数调用和依赖项注入(如果有)完成后调用@PostConstruct方法。您可以使用@PostConstruct注释方法初始化bean的实例变量。在这种情况下,使用@PostConstruct和CDI的差异b / w是,CDI返回的实例是上下文实例,因为它是@RequestScoped,'生成'bean的生命周期仅限于一个HTTP请求。一旦现有的HTTP请求完成,就会生成一个新的bean实例。对于@PostConstruct,它的@Dependent范围bean(默认情况下)及其生命周期将“依赖”注入它的bean(使用CDI @Inject)