前言

在java中,我想大家都用过内部类,今天要介绍的是spring中注入的内部Beans,与内部类类似,顾名思义,它就是被定义在某个Bean中的内部Bean。听起来有点奇怪,还是看个简单的配置实例就清楚了:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <bean id="outerBean" class="...">
        <property name="target">
            <bean id="innerBean" class="..."/>
        </property>
    </bean>
</beans>

如上所示,如果在一个bean的或者元素标签内部定义的Bean则称为内部Bean。

用内部Bean改写上一篇的例子

由于大部分代码与上一篇一样,为了节省篇幅,这里只给出改动的部分,也就是xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <!-- <bean id="tv" class="sirk_spring_tuto.demo.TV">
      <constructor-arg ref="screen"></constructor-arg>
    </bean> -->

    <bean id="tv" class="sirk_spring_tuto.demo.TV">
   <!-- <property name="screen" ref="screen"></property> -->
    <property name="screen">
    <bean id="screen" class="sirk_spring_tuto.demo.CRTScreen"></bean>
    </property>
    </bean>
   <!-- <bean id="screen" class="sirk_spring_tuto.demo.CRTScreen"></bean> -->
</beans>

其中注释部分为上篇内容。是不是很简单?运行结果应该和上一篇一样哦。如果出错或者不一样,那说明程序哪里不对了,请仔细检查下。既然一样,为什么spring还要提供这种方式,而不是和上篇一样ref其它的bean呢?好问题,其实非要讨论它们的区别的话,可以理解为它们的作用域不太一样。这里的内部bean很明显只能被它外部包含它的bean可用,如上面例子,也就是id为tv的bean使用它。但是如果和上篇一样,把id为screen的bean放到外面,那么不仅仅id为tv的bean可以引用它,其它定义的bean也可以通过ref这种方式引用它。所以,在大多数情况下还是使用ref的方式的,除非你很确定某个bean只会被一个bean所用,不然就不建议使用inner bean了。另外,在inner bean中可以不定义id或者name,因为他很不需要被外部某些bean所引用,自然id或者name没什么作用了。

小结

本文简单介绍了spring中的inner bean注入。是否觉得非常愉快呢,原来很简单啊,因为这是新手攻略嘛,总不好让新手看很复杂的东西吧,如果你觉得不过瘾,别担心,完成新手攻略后,博主打算搞一个升级版本的攻略(又要挖坑了-. -),敬请期待哦!

##文档信息