Spring标准Bean注入与自动装配

时间:2011-05-04 22:29:57

标签: spring spring-mvc

据我所知,当使用依赖注入时,所有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注入?

希望我明白自己。

4 个答案:

答案 0 :(得分:12)

首先,您应该将@Service@Component添加到SimpleUserService课程。

  • 1是的,UserPreferences的ONE实例是在应用程序初始化时创建的
  • 2默认范围是单例,您可以使用@Scope注释更改它(@See Spring Reference: 3.11.4.4 Specifying bean scope
  • 3组件扫描和XML配置以相同的方式工作(生命周期)

也许你应该花一些时间来理解Spring的生命周期。您需要了解Spring以这种方式工作(不是100%正确):

  • 首先创建一个bean池
  • 然后它将属性注入到bean

但它不能以这种方式工作:学习一个类,看看它需要什么引用来创建这个引用(递归),然后创建类。

如果您理解这一点,那么您也会理解,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 @Beanscope <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