我对这个小话题感到困惑。我读到某个地方,如果用@Component
注释了一个类,则它是spring托管的bean,只要需要,spring就会提供它。我把它与bean的范围混淆了。让我解释一下:
我们说一堂课
@Component
public class Example{ }
如果我使用new Example()
在其他类中实例化该类,那么容器是否会一直为我提供相同的Example对象?还是每次都会给我新的东西?
这是令人困惑的部分:
如果在同一个班级,我有两个像这样的豆子:
@Component
public class Example {
@Bean DataSource sqlDataSource() {
// some logic
}
@Bean @Scope("prototype") SomeObject getSomeObject() {
return new SomeObject(sqlDataSource()); //**
}
}
在这种情况下会发生什么?每次请求SomeObject bean时,sqlDataSource()方法调用会一次又一次返回相同的对象,还是每次请求SomeObject时都会返回新的DataSource实例?
请帮助。
答案 0 :(得分:1)
@Bean DataSource sqlDataSource() {
// some logic
}
这定义了DataSource的单例实例。因此,每次您请求SomeObject的实例时,都会创建一个新的SomeObject(在原型范围中定义),但是它们都将共享同一个DataSource对象(因为它是单例bean)。
答案 1 :(得分:1)
@Bean是方法级别的注释,它指示Spring在调用该方法时创建一个bean。这意味着具有与XML配置中的标记相同的功能。
此注释必须在@Configuration带注释的类中使用,否则,如果您从另一个方法调用该方法,则它将是常规的Java新操作,而不是spring的操作。看到这篇文章-> @Bean inside class with @Configuration and witout it
请牢记这一点:new SomeObject(sqlDataSource());等于new SomeObject(new SqlDataSource());
如果使用@Configuration注释示例,将发生的情况是,您将始终获得带有相同sqlDataSource对象的新SomeObject实例,这意味着Spring将只创建一个sqlDataSource,因为它是单例的。