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