用Spring定义bean

时间:2014-02-19 18:56:38

标签: java spring dependency-injection

我开始读一本关于Spring的书,我一直在问自己一个问题:

使用Spring的XML文件中的Spring Expression Language和Java类中的常规方法定义bean有什么区别。例如,我们有两个等效的实现:

<bean id="carl" class="springinaction.springidol.Instrumentalist" >
<property name="song" value="#{kenny.song}" /> 
</bean>

Instrumentalist carl = new Instrumentalist();
carl.setSong(kenny.getSong());

何时以及为什么我应该使用单向而不是另一种方式?

2 个答案:

答案 0 :(得分:1)

<bean id="carl" class="springinaction.springidol.Instrumentalist" >
<property name="song" value="#{kenny.song}" /> 
</bean>

此代码包含在正确的Spring配置文件中,将生成Spring托管对象。默认情况下,Spring bean的范围是单例,只有一个实例,可以使用ApplicationContext#getBean方法访问。

Instrumentalist carl = new Instrumentalist();
carl.setSong(kenny.getSong());

此代码包含在正确的Java方法中,将在JVM堆上创建一个实例,可以通过变量carl访问该实例。只要存在引用它的变量,实例就会存在。然后它将被选为垃圾收集。

答案 1 :(得分:0)

如果你问的是依赖注入,你应该阅读这个

总结依赖注入,它是一种转换类型依赖关系的模式。您可以将它们移动到管理它们的组件,而不是将您的依赖项直接放在应用程序类中。这个组件通常被称为控制反转容器,而Spring provides primarily是什么。您可以使用XML执行此操作,也可以使用Java执行此操作。换句话说,虽然您正在转移依赖项,但可以在运行时(使用XML)或在编译时(使用Java)定义它们。

如果您一直在询问为什么要使用XML与Java配置上下文,那么其中一个答案是,如果您正在使用,则不必重新编译源代码以更改配置XML。 chrylis也提出了一些好处。 XML不是类型安全的(但我从未遇到过问题)。

但是,有些配置很难用于XML。 Spring声明的XML模式是限制性的,并强制您使用某些编码约定。使用Java配置,您不具备这些限制。您可以按照自己的方式创建对象。