> 文档中心 > 【Spring入门 】6.注入内部Bean

【Spring入门 】6.注入内部Bean


内部Bean

将定义在元素的或元素内部的Bean,称为“内部Bean”

Setter方式注入内部Bean

通过 setter 方式注入内部 Bean。在 标签下的 元素中,再次使用 元素对内部 Bean 进行定义,格式如下。

<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.0.xsd"> <bean id="outerBean" class="……"> <property name="……" >        <bean class="……">  <property name="……" value="……" ></property>  ……     </bean>      </property>    </bean></beans>

注意:内部 Bean 都是匿名的,不需要指定 id 和 name 的。即使制定了,IoC 容器也不会将它作为区分 Bean 的标识符,反而会无视 Bean 的 Scope 标签。因此内部 Bean 几乎总是匿名的,且总会随着外部的 Bean 创建。内部 Bean 是无法被注入到它所在的 Bean 以外的任何其他 Bean 的。

构造函数方式注入内部 Bean

通过构造方法注入内部 Bean。在 标签下的 元素中,再次使用 元素对内部 Bean 进行定义,格式如下。

<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.0.xsd">    <bean id="……" class="……"> <constructor-arg name="……">          <bean class="……">  <constructor-arg name="……" value="……"></constructor-arg>  ……     </bean> </constructor-arg>    </bean></beans>

示例:

package org.demo2;/** * 部门类 */public class Dept {    private  String deptNo;    private String deptName;   //使用setter注入或p命名空间注入,需要有无参构造,有其他带参构造不会默认存在    public Dept() {    }    //c命名空间注入 / 构造函数注入constructor-arg    public Dept(String deptNo, String deptName) { this.deptNo = deptNo; this.deptName = deptName;    }    //p命名空间注入 setter注入 property    public void setDeptNo(String deptNo) { this.deptNo = deptNo;    }    public void setDeptName(String deptName) { this.deptName = deptName;    }    @Override    public String toString() { return "Dept{" +  "deptNo='" + deptNo + '\'' +  ", deptName='" + deptName + '\'' +  '}';    }}
package org.demo2;/** * 员工类 */public class Employee {    private String empNo;    private String empName;    private Dept dept;    //使用setter注入或p命名空间注入,需要有无参构造,有其他带参构造不会默认存在    public Employee() {    }    //c命名空间注入 / 构造函数注入constructor-arg    public Employee(String empNo, String empName, Dept dept) { this.empNo = empNo; this.empName = empName; this.dept = dept;    }    @Override    public String toString() { return "Employee{" +  "empNo='" + empNo + '\'' +  ", empName='" + empName + '\'' +  ", dept=" + dept +  '}';    }    //p命名空间注入 setter注入 property    public void setEmpNo(String empNo) { this.empNo = empNo;    }    public void setEmpName(String empName) { this.empName = empName;    }    public void setDept(Dept dept) { this.dept = dept;    }}
package org.demo2;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp {    private static final Log LOGGER = LogFactory.getLog(MainApp.class);    public static void main(String[] args) { //获取 ApplicationContext 容器 ApplicationContext context=new ClassPathXmlApplicationContext("demo2beans.xml");//获取 p命名空间注入 的 Bean Employee pEmp = context.getBean("pEmp", Employee.class); //获取 c命名空间注入 的 Bean Employee cEmp = context.getBean("cEmp",Employee.class); //Setter方法注入内部Bean Employee sEmp=context.getBean("sEmp",Employee.class); //构造方法注入内部Bean Employee conEmp=context.getBean("conEmp",Employee.class); //通过日志打印信息 LOGGER.info(pEmp.toString()); LOGGER.info(cEmp.toString()); LOGGER.info(sEmp.toString()); LOGGER.info(conEmp.toString());    }}
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:c="http://www.springframework.org/schema/c"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">        <bean id="pEmp" class="org.demo2.Employee" p:empName="P小李" p:empNo="2222" p:dept-ref="pDept"></bean>    <bean id="pDept" class="org.demo2.Dept" p:deptName="开发部" p:deptNo="1"></bean>        <bean id="cEmp" class="org.demo2.Employee" c:empName="C小王" c:empNo="1111" c:dept-ref="cDpet"></bean>    <bean id="cDpet" class="org.demo2.Dept" c:deptName="运维部" c:deptNo="2"></bean>        <bean id="sEmp" class="org.demo2.Employee"> <property name="empNo" value="001"></property> <property name="empName" value="小王"></property> <property name="dept">          <bean class="org.demo2.Dept">  <property name="deptNo" value="004"></property>  <property name="deptName" value="技术部"></property>     </bean> </property>    </bean>        <bean id="conEmp" class="org.demo2.Employee"> <constructor-arg name="empNo" value="002"></constructor-arg> <constructor-arg name="empName" value="小李"></constructor-arg> <constructor-arg name="dept">          <bean class="org.demo2.Dept">  <constructor-arg name="deptNo" value="002"></constructor-arg>  <constructor-arg name="deptName" value="人事部"></constructor-arg>     </bean> </constructor-arg>    </bean></beans>