Spring注入内部Bean

  • Post author:
  • Post category:其他


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



setter 方式注入内部 Bean

我们可以通过 setter 方式注入内部 Bean。此时,我们只需要在 标签下的 元素中,再次使用 元素对内部 Bean 进行定义,格式如下。

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

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



示例

下面我们就通过一个实例,演示下如何使用 setter 方法注入内部 Bean。

1. 参考《[第一个 Spring 程序]》,新建一个名为 my-spring-demo2 的 Java 项目。

2. 在 net.biancheng.c 包中,创建一个名为 Dept 的类,代码如下。


1.  package net.biancheng.c;

3.  public class  Dept {
4.  //部门编号
5.  private String  deptNo;
6.  //部门名称
7.  private String  deptName;

9.  public void setDeptNo(String  deptNo) {
10.  this.deptNo = deptNo;
11.  }

13.  public void setDeptName(String  deptName) {
14.  this.deptName = deptName;
15.  }

17.  @Override
18.  public String  toString() {
19.  return "Dept{" +
20.  "deptNo='" + deptNo + '\'' +
21.  ", deptName='" + deptName + '\'' +
22.  '}';
23.  }
24.  }

3. 在 net.biancheng.c 包下,创建一个名为 Employee 的类,代码如下。


1.  package net.biancheng.c;

3.  public class  Employee {
4.  //员工编号
5.  private String  empNo;
6.  //员工姓名
7.  private String  empName;
8.  //部门信息
9.  private Dept  dept;

11.  public void setEmpNo(String  empNo) {
12.  this.empNo = empNo;
13.  }

15.  public void setEmpName(String  empName) {
16.  this.empName = empName;
17.  }

19.  public void setDept(Dept  dept) {
20.  this.dept = dept;
21.  }

23.  @Override
24.  public String  toString() {
25.  return "Employee{" +
26.  "empNo='" + empNo + '\'' +
27.  ", empName='" + empName + '\'' +
28.  ", dept=" + dept +
29.  '}';
30.  }
31.  }

4. 在 src 目录下创建 Spring 配置文件 Beans.xml,配置如下。

1.  

5. 在 net.biancheng.c 包下,创建一个名为 MainApp 的类,代码如下。


1.  package net.biancheng.c;

3.  import org.apache.commons.logging.Log;
4.  import org.apache.commons.logging.LogFactory;
5.  import org.springframework.context.ApplicationContext;
6.  import org.springframework.context.support.ClassPathXmlApplicationContext;

8.  public class  MainApp {
9.  private static final Log  LOGGER = LogFactory.getLog(MainApp.class);

11.  public static void main(String[] args) {
12.  //获取 ApplicationContext 容器
13.  ApplicationContext  context = new ClassPathXmlApplicationContext("Beans.xml");
14.  //获取名为 employee 的 Bean
15.  Employee  employee = context.getBean("employee", Employee.class);
16.  //通过日志打印员工信息
17.  LOGGER.info(employee.toString());
18.  }
19.  }

6. 执行 MainApp 中的 main() 方法,控制台输出如下。

十二月 17, 2021 10:46:06 上午 net.biancheng.c.MainApp main
信息: Employee{empNo='001', empName='小王', dept=Dept{deptNo='004', deptName='技术部'}}



构造函数方式注入内部 Bean

我们可以通过构造方法注入内部 Bean。此时,我们只需要在 标签下的 元素中,再次使用 元素对内部 Bean 进行定义,格式如下。

1.  



示例

下面我们就通过一个实例,演示下如何在通过构造方法的方式注入内部 Bean。

1. 参考《

第一个 Spring 程序

》,新建一个名为 my-spring-demo3 的 Java 项目。

2. 在 net.biancheng.c 包中,创建一个名为 Dept 的类,代码如下。


1.  package net.biancheng.c;

3.  public class  Dept {
4.  //部门编号
5.  private String  deptNo;
6.  //部门名称
7.  private String  deptName;

9.  public Dept(String  deptNo, String  deptName) {
10.  this.deptNo = deptNo;
11.  this.deptName = deptName;
12.  }

14.  @Override
15.  public String  toString() {
16.  return "Dept{" +
17.  "deptNo='" + deptNo + '\'' +
18.  ", deptName='" + deptName + '\'' +
19.  '}';
20.  }
21.  }

3. 在 net.biancheng.c 包下,创建一个名为 Employee 的类,代码如下。


1.  package net.biancheng.c;

3.  public class  Employee {
4.  //员工编号
5.  private String  empNo;
6.  //员工姓名
7.  private String  empName;
8.  //部门信息
9.  private Dept  dept;

11.  public Employee(String  empNo, String  empName, Dept  dept) {
12.  this.empNo = empNo;
13.  this.empName = empName;
14.  this.dept = dept;
15.  }

17.  @Override
18.  public String  toString() {
19.  return "Employee{" +
20.  "empNo='" + empNo + '\'' +
21.  ", empName='" + empName + '\'' +
22.  ", dept=" + dept +
23.  '}';
24.  }
25.  }

4. 在 src 目录下创建 Spring 配置文件 Beans.xml,配置如下。

1.  

5. 在 net.biancheng.c 包下,创建一个名为 MainApp 的类,代码如下。


1.  package net.biancheng.c;

3.  import org.apache.commons.logging.Log;
4.  import org.apache.commons.logging.LogFactory;
5.  import org.springframework.context.ApplicationContext;
6.  import org.springframework.context.support.ClassPathXmlApplicationContext;

8.  public class  MainApp {
9.  private static final Log  LOGGER = LogFactory.getLog(MainApp.class);

11.  public static void main(String[] args) {
12.  //获取 ApplicationContext 容器
13.  ApplicationContext  context = new ClassPathXmlApplicationContext("Beans.xml");
14.  //获取名为 employee 的 Bean
15.  Employee  employee = context.getBean("employee", Employee.class);
16.  //通过日志打印员工信息
17.  LOGGER.info(employee.toString());
18.  }
19.  }

6. 执行 MainApp 中的 main() 方法,控制台输出如下。

十二月 17, 2021 10:56:36 上午 net.biancheng.c.MainApp main
信息: Employee{empNo='002', empName='小李', dept=Dept{deptNo='005', deptName='运维部'}}



版权声明:本文为m0_54850604原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。