【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>