据我了解,当使用依赖注入(inject)时,所有 bean 都在开始时进行初始化。
<bean id="userPreferences" class="com.foo.UserPreferences">
</bean>
<!-- a singleton-scoped bean injected to the above bean -->
<bean id="userService" class="com.foo.SimpleUserService">
<!-- a reference to the userPreferences bean -->
<property name="userPreferences" ref="userPreferences"/>
</bean>
上面的配置意味着在应用程序启动时创建了 userService 和 userPreferences。对吗?
使用 Autowiring 和使用 <context:component-scan>
时
public class SimpleUserService{
@Autowired
UserPreferences userPreferences;
//omitted
}
1) userPreference 是在 Application init 上创建的吗?
2) autowire 注入(inject)的 bean 的默认作用域是什么,我们如何改变它?
3) 如何影响 bean 创建和 bean 注入(inject)?
希望我说清楚了。
最佳答案
首先你应该将 @Service
或 @Component
添加到 SimpleUserService
类中。
- 1 是的,UserPreferences 的 ONE 实例是在应用程序初始化时创建的
- 2 默认作用域是单例,你可以通过@Scope 注解改变它(@See Spring Reference: 3.11.4.4 Specifying bean scope)
- 3 组件扫描和 XML 配置的工作方式相同(生命周期)
也许您应该花一些时间来了解 Spring 生命周期。您需要了解 Spring 以这种方式工作(不是 100% 正确):
- 首先它会创建一个 bean 池
- 然后它将属性注入(inject)到 bean 中
但它不是这样工作的:获取一个类,看看它需要什么引用创建这个引用(递归),然后创建类。
如果你理解了这一点,那么你也会明白,bean 的 @Scope 是在 bean 声明/类中定义的,而不是在引用中。
关于Spring 标准 Bean 注入(inject)与 Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5890605/