如果某个Bean所依赖的Bean不想被Spring容器直接访问,可以使用嵌套Bean。<bean.../>元素用来定义嵌套Bean,嵌套Bean只对嵌套它的外部Bean有效,Spring容器无法直接访问嵌套Bean,因此定义嵌套Bean时无须指定id属性:
Axe.java :
public interface Axe {
public String chop();
}
Person.java :
public interface Person {
public void useAxe();
}
Chinese.java :
public class Chinese implements Person{
private Axe axe;
public void setAxe(Axe axe) {
this.axe = axe;
}
@Override
public void useAxe() {
System.out.println(axe.chop());
}
}
SteelAxe.java :
public class SteelAxe implements Axe{
@Override
public String chop() {
return "钢斧砍柴好快";
}
}
bean.xml核心配置:
<bean id="chinese" class="com.bean.Chinese">
<property name="axe">
<bean class="com.bean.SteelAxe"/>
</property>
</bean>
采用上面的配置形式可以保证嵌套Bean不能被容器访问,因此不用担心其他程序修改嵌套Bean。外部Bean的用法与之前的用法完全一样。
嵌套Bean限制了Bean的访问,提高了程序的内聚性。
使用嵌套Bean与使用ref引用容器中另一个Bean在本质上是一样的。其实,为Bean实例注入属性,当属性的类型为复合类型时,就需要传入一个Java对象,于是有两种方式:
① 使用ref引用一个容器中已经配置的Bean(Java对象)。
② 使用bean临时配置一个嵌套Bean(Java对象)。
Test.java :
public class Test {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");
Person p=(Person) ctx.getBean("chinese");
p.useAxe();//钢斧砍柴好快
}
}