Java 用Spring定义bean

Java 用Spring定义bean,java,spring,dependency-injection,Java,Spring,Dependency Injection,我开始读一本关于春天的书,我一直在问自己一个问题: 在Spring的XML文件中使用Spring表达式语言定义bean与在Java类中使用常规方法有什么区别。例如,我们有两个等效的实现: <bean id="carl" class="springinaction.springidol.Instrumentalist" > <property name="song" value="#{kenny.song}" /> </bean> 何时以及为什么我应该使用一

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

在Spring的XML文件中使用Spring表达式语言定义bean与在Java类中使用常规方法有什么区别。例如,我们有两个等效的实现:

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

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

如果您想了解依赖注入,您应该阅读以下内容

总结一下依赖注入,它是一种转换类型依赖的模式。您可以将依赖项移动到管理它们的组件中,而不是将它们直接放在应用程序类中。这个组件通常被称为控制反转容器,就是这样。您可以使用XML或Java来实现这一点。换句话说,尽管您正在改变依赖关系,但它们可以在运行时(使用XML)或编译时(使用Java)定义

如果您问为什么要用XML和Java配置您的上下文,那么其中一个答案是,如果您使用XML,您不必重新编译源代码来更改配置。也提出了一些好的观点。XML不是类型安全的(但我从来没有遇到过这个问题)

但是,有些配置很难使用XML。Spring声明的XML模式是限制性的,它迫使您使用一些编码约定。使用Java配置,您没有这些限制。可以按任何方式创建对象

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

这段代码包含在适当的Java方法中,将在JVM堆上创建一个实例,该实例可以通过变量carl访问。只要存在引用该实例的变量,该实例就会存在。然后可以选择它进行垃圾收集。

但是您通常仍然需要重新构建打包,而且它不是类型安全的。@chrylis我的意思是选择bean类。在XML中,您只需更改bean
属性和任何
字段。在爪哇,你必须重新编译整个配置类(ES)。你认为给一个教程的地址一个正确的答案是正确的,但是重新编译对现代的开发实践来说并不是什么大问题,尤其是在重新编译或不重新编译几个类之间的区别。“安德烈斯,你说得对。我在一篇编辑文章中总结了我对依赖注入的理解。请看一看。您可能的副本尚未提供任何上下文。该
元素正在定义一个名为
carl
的新bean,其类型为
Instrumentalist
,属性名为
song
,它引用另一个名为
kenny
的bean的属性。此bean仅对
ApplicationContext
有任何意义。您在上下文之外展示的Java代码没有解释任何内容。您只是创建一个对象并调用它的一个方法,传递调用另一个对象上的另一个方法的返回值的值。
<bean id="carl" class="springinaction.springidol.Instrumentalist" >
<property name="song" value="#{kenny.song}" /> 
</bean>
Instrumentalist carl = new Instrumentalist();
carl.setSong(kenny.getSong());