我对这个小话题感到困惑。我在某处读到,如果一个类用 @Component
注释,那么它就是 spring 管理的 bean,只要需要它,spring 就会提供它。我将它与 bean 的范围混淆了。让我解释一下:
假设有一个类
@Component
public class Example{ }
如果我使用new Example()
在其他类中实例化此类,容器是否会始终为我提供相同的示例对象?或者它每次都会返回我新的对象?
这里是令人困惑的部分:
如果在同一个类中我有两个像这样的bean:
@Component
public class Example {
@Bean DataSource sqlDataSource() {
// some logic
}
@Bean @Scope("prototype") SomeObject getSomeObject() {
return new SomeObject(sqlDataSource()); //**
}
}
这种情况下会发生什么?每次请求 SomeObject bean 时,sqlDataSource() 方法调用都会一次又一次返回相同的对象,或者每次请求 SomeObject 时都会返回 DataSource 的新实例?
最佳答案
@Bean 是一个方法级注释,指示 Spring 在调用该方法时创建一个 bean。这意味着具有与 XML 配置中标记相同的功能。
这个注解必须在@Configuration注解的类内部使用,否则如果你从另一个方法调用该方法,它将是一个普通的java new操作,而不是spring的。请参阅这篇文章 --> @Bean inside class with @Configuration and witout it
牢记这一点 new SomeObject(sqlDataSource());将等于 new SomeObject(new SqlDataSource());
如果你用@Configuration注释Example,将会发生的情况是,你总是会得到一个具有相同sqlDataSource对象的新SomeObject实例,这意味着Spring将只创建一个sqlDataSource,因为它是单例的。
关于java - 通过方法调用获取 Spring beans 与 new 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54501280/