7.10 高级依赖关系配置

7.10 高级依赖关系配置

Spring允许将Bean实例的所有成员变量,甚至基本类型的成员变量都通过配置文件来指定值,这种方式提供了很好的解耦。但是否真的值得呢?如果将基本类型的成员变量值也通过配置文件指定,虽然提供了很好的解耦,但大大降低了程序的可读性(必须同时参照配置文件才可知道程序中各成员变量的值)。因此,滥用依赖注入也会引起一些问题.
通常的建议是,组件与组件之间的耦合,采用依赖注入管理;但基本类型的成员变量值,应直接在代码中设置。对于组件之间的耦合关系,通过使用控制反转,代码变得非常清晰。因此,Bean无须管理依赖关系,而是由容器提供注入,Bean无须知道这些实例在哪里,以及它们具体的实现。
前面介绍的依赖关系,要么是基本类型的值,要么直接依赖于其他Bean。在实际的应用中,某个Bean实例的属性值可能是某个方法的返回值,或者类的Field值,或者另一个对象的getter方法返回值,Spring同样可以支持这种非常规的注入方式。 Spring甚至支持将任意方法的返回值、类或对象的Fed值、其他Beangetter法返回值,直接定义成容器中的一个Bean。下面将深入介绍这些特殊的注入形式。
Spng框架的本质是,开发者在Spring配置文件中使用XML元素进行配置,实际Spring执行相应的代码。例如:

  • 使用<bean>元素,实际启动Spring执行无参数或有参数的构造器,或者调用工厂方法创建Bean.
  • 使用<property>元素,实际驱动Spring执行一次setter方法。

Java程序还可能有其他类型的语句,如调用getter方法、调用普通方法、访问类或对象的Field,而Spring也为这种语句提供了对应的配置语法

  • 调用getter方法:使用PropertyPathFactoryBean
  • 访问类或对象的Field值:使用FieldRetrievingFactoryBean
  • 调用普通方法:使用MethodInvokingFactoryBean