7.5.7 注入嵌套Bean

7.5.7 注入嵌套Bean

如果某个Bean所依赖的Bean不想被Spring容器直接访问,则可以使用嵌套Bean.
<bean>配置成<property><constructor-args>的子元素,那么该<bean>元素配置的Bean仅仅作为setter注入、构造注入的参数,这种Bean就是嵌套Bean。由于容器不能获取嵌套Bean,因此它不需要指定id属性。

例如如下配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="chinese" class="org.crazyit.app.service.impl.Chinese">
<!-- 驱动调用chinese的setAxe()方法,使用嵌套Bean作为参数 -->
<property name="axe">
<!-- 嵌套Bean配置的对象仅作为setter方法的参数 嵌套Bean不能被容器访问,因此无需指定id属性 -->
<bean class="org.crazyit.app.service.impl.SteelAxe" />
</property>
</bean>
</beans>

采用上面的配置形式可以保证嵌套Bean不能被容器访问,因此不用担心其他程序修改嵌套Bean。外部Bean的用法与之前的用法完全一样,使用结果也没有区别。

什么时候用嵌套Bean

嵌套Bean提高了程序的内聚性,但降低了程序的灵活性。只有在完全确定无须通过Spring容器访问某个Bean实例时,才考虑使用嵌套Bean来配置该Bean

使用嵌套Bean与使用ref引用容器中另一个Bean在本质上是一样的。
Spring框架的本质就是通过XML配置文件来驱动Java代码,当程序要调用setter方法或有参数的构造器时,程序总需要传入参数值,随参数类型的不同, Spring配置文件当然也要随之改变。

  1. 形参类型是基本类型、 String、日期等,直接使用value指定字面值即可。
  2. 形参类型是复合类(如PersonDogData Source等),那就需要传入一个Java对象作为实参,于是有三种方式:
    • 使用ref引用一个容器中已配置的Bean(Java对象);
    • 使用自动装配
    • 使用<bean>元素配置一个嵌套Bean(Java对象);

除此之外,形参类型还可能是SetListMap等集合,也可能是数组类型。接下来继续介绍如何在Spring配置文件中配置setListMap数组等参数值。

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\nestedBean
└─src\
├─beans.xml
├─lee\
│ └─BeanTest.java
└─org\
└─crazyit\
└─app\
└─service\
├─Axe.java
├─impl\
│ ├─Chinese.java
│ ├─SteelAxe.java
│ └─StoneAxe.java
└─Person.java