@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)
我在阅读 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)