据我所知,当使用依赖注入时,所有bean都在Start上初始化。
<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。这是对的吗?
使用自动装配并使用<context:component-scan>
public class SimpleUserService{
@Autowired
UserPreferences userPreferences;
//omitted
}
1)是否在Application init上创建了userPreference?
2)autowire注入的bean的默认范围是什么?我们如何更改它?
3)如何影响bean创建和bean注入?
希望我明白自己。答案 0 :(得分:12)
首先,您应该将@Service
或@Component
添加到SimpleUserService
课程。
也许你应该花一些时间来理解Spring的生命周期。您需要了解Spring以这种方式工作(不是100%正确):
但它不能以这种方式工作:学习一个类,看看它需要什么引用来创建这个引用(递归),然后创建类。
如果您理解这一点,那么您也会理解,bean的@Scope是在bean声明/类中定义的,而不是在引用中定义的。
答案 1 :(得分:4)
1)是否创建了userPreference 应用程序初始化?
在任何一种情况下,加载Spring Context时都会初始化userPreferences。您可以通过将lazy-init="true"
添加到bean配置来更改此行为。
2)bean的默认范围是什么 由autowire注入,我们怎么样 改变它?
注入的范围是加载到Spring中的所有bean。如果从其他项目导入XML配置,也会包含它。我不确定你是否可以限制范围。
3)如何影响bean创建和bean 注射?
无论是自动装配还是通过XML配置,行为应该是相同的。我更喜欢在自动注释上明确定义依赖关系。然后我也喜欢强类型语言。
答案 2 :(得分:3)
上面的配置意味着在应用程序启动时创建的userService和userPreferences。这是对的吗?
是
是否在Application init上创建了userPreference?
是
autowire注入的bean的默认范围是什么?我们如何更改它?
默认范围始终为“singleton”。可以使用@Scope
@Bean
或scope
<bean>
上的{{1}} XML属性来更改此内容。
如何影响bean创建和bean注入?
这不是一个明确的问题。如果更改bean范围,则在创建时更改(应用程序启动,每个请求,每个会话等)。接线配置保持不变,只有生命周期发生变化。
答案 3 :(得分:1)
@autowired符号是一种过时的方式来表示@inject。后者是JavaEE 6的一个特性。
stackoverflow.com/questions/7142622/what-is-the-difference-between-inject-and-autowired-in-spring-framework-which