Spring注入内部Bean
【摘要】 内部Bean将定义在<bean>元素的<property>或<constructor-arg>元素内部的Bean,称为“内部Bean” Setter方式注入内部Bean通过 setter 方式注入内部 Bean。在 <bean> 标签下的 <property> 元素中,再次使用 <bean> 元素对内部 Bean 进行定义,格式如下。<?xml version="1.0" encoding...
内部Bean
将定义在<bean>元素的<property>或<constructor-arg>元素内部的Bean,称为“内部Bean”
Setter方式注入内部Bean
通过 setter 方式注入内部 Bean。在 <bean> 标签下的 <property> 元素中,再次使用 <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.0.xsd">
<bean id="outerBean" class="……">
<property name="……" >
<!-- 定义内部 Bean -->
<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> 标签下的 <constructor-arg> 元素中,再次使用 <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-->
<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());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--p命名空间注入-->
<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>
<!--c命名空间注入-->
<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>
<!--Setter方法注入内部Bean-->
<bean id="sEmp" class="org.demo2.Employee">
<property name="empNo" value="001"></property>
<property name="empName" value="小王"></property>
<property name="dept">
<!--内部Bean-->
<bean class="org.demo2.Dept">
<property name="deptNo" value="004"></property>
<property name="deptName" value="技术部"></property>
</bean>
</property>
</bean>
<!--构造方法注入内部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-->
<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>
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)