我在这样的配置类中创建了一个spring bean:
@Bean
MyClass getMyClass() {
MyClass mc = new MyClass()
return mc;
}
每当
MyClass
在另一个需要注入(inject)的类中 Autowiring ,它是否总是会根据 new
创建一个新对象?在bean定义中?以这种方式创建的 bean 是真正的单例吗?
最佳答案
Spring
保证您在使用 Bean
注释的方法中所做的任何事情注释它只会做一次。内部 Spring 工厂会处理这个问题。
当然,这取决于 scope
但默认范围是 singleton
.请参阅文档:
小例子应该可以帮助您了解它是如何工作的:
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
import java.util.Random;
@Configuration
public class SpringApp {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringApp.class);
System.out.println(ctx.getBean(MyClass.class));
System.out.println(ctx.getBean(MyClass.class));
System.out.println(ctx.getBean(MyClass.class));
System.out.println(ctx.getBean(MyClass.class));
}
@Bean
public MyClass getMyClass() {
System.out.println("Create instance of MyClass at " + LocalDateTime.now());
MyClass myClass = new MyClass();
return myClass;
}
}
class MyClass {
private int value = new Random().nextInt();
@Override
public String toString() {
return super.toString() + " with values = " + value;
}
}
打印:
Create instance of MyClass at 2019-01-09T22:54:37.025
com.celoxity.spring.MyClass@32a068d1 with values = -1518464221
com.celoxity.spring.MyClass@32a068d1 with values = -1518464221
com.celoxity.spring.MyClass@32a068d1 with values = -1518464221
com.celoxity.spring.MyClass@32a068d1 with values = -1518464221
当您定义具有范围
protoype
的 bean 时@Scope("prototype")
@Bean
public MyClass getMyClass()
应用程序打印:
Create instance of MyClass at 2019-01-09T22:57:12.585
com.celoxity.spring.MyClass@282003e1 with values = -677868705
Create instance of MyClass at 2019-01-09T22:57:12.587
com.celoxity.spring.MyClass@7fad8c79 with values = 18948996
Create instance of MyClass at 2019-01-09T22:57:12.587
com.celoxity.spring.MyClass@71a794e5 with values = 358780038
Create instance of MyClass at 2019-01-09T22:57:12.587
com.celoxity.spring.MyClass@76329302 with values = 868257220
关于spring - 用NEW创建的spring bean真的是单例吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54118541/