我很困惑这个小话题。我曾读到,如果一个类与@Component
注解,它是春天的托管bean什么时候需要它,春天就会提供。我有一个bean的范围混淆它。让我解释:
比方说,一类
@Component
public class Example{ }
如果我实例化这个类中使用new Example()
其他类中,将容器总是给我同样的例子中的物体所有的时间?还是会返回每次我新的目标?
这里谈到的混淆的部分:
如果在同一个班,我有两个豆是这样的:
@Component
public class Example {
@Bean DataSource sqlDataSource() {
// some logic
}
@Bean @Scope("prototype") SomeObject getSomeObject() {
return new SomeObject(sqlDataSource()); //**
}
}
将在此情况下,会发生什么? SqlDataSource的()方法调用将再次返回相同的对象,并再次要求每次SomeObject豆,或者数据源的新实例将被返回每次SomeObject要求?
请帮忙。
@Bean是一个方法级的注释,表明春天调用该方法时,创建一个bean。这意味着在XML配置相同的功能腋臭标签。
此注释必须在@Configuration注解类的内部使用,否则,如果你调用从另一个方法,该方法将是一个普通的Java新的操作,而不是春天的。看到这个帖子 - > @Bean inside class with @Configuration and witout it
考虑到新SomeObject到这一点(的SqlDataSource());将等于新SomeObject(新的SqlDataSource());
如果你注释实例与@Configuration会发生什么是你会得到总是新SomeObject实例与同一SqlDataSource的对象,这意味着春天将只创建一个SqlDataSource的,因为它是单身的照顾。
@Bean DataSource sqlDataSource() {
// some logic
}
这定义数据源的单一实例。所以每次你申请一个新的SomeObject将创建SomeObject的一个实例(当它在原型范围内定义),但他们都将共享同一个数据源对象(因为它是一个单例的bean)。