spring——Spring 注入内部Bean——setter 方式注入内部 Bean

港控/mmm° 2024-03-31 17:23 194阅读 0赞

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

项目依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>ssw</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <maven.compiler.source>8</maven.compiler.source>
  11. <maven.compiler.target>8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-context</artifactId>
  17. <version>5.3.6</version>
  18. </dependency>
  19. </dependencies>
  20. </project>

fb5a3d6bde1db13313284ced04f340dd.png

dept类:

  1. package org.example;
  2. public class Dept {
  3. //部门编号
  4. private String deptNo;
  5. //部门名称
  6. private String deptName;
  7. public void setDeptNo(String deptNo) {
  8. this.deptNo = deptNo;
  9. }
  10. public void setDeptName(String deptName) {
  11. this.deptName = deptName;
  12. }
  13. @Override
  14. public String toString() {
  15. return "Dept{" +
  16. "deptNo='" + deptNo + '\'' +
  17. ", deptName='" + deptName + '\'' +
  18. '}';
  19. }
  20. }

f4da531471a28a6a51346e53cca0c643.png

employee类:

  1. package org.example;
  2. public class Employee {
  3. //员工编号
  4. private String empNo;
  5. //员工姓名
  6. private String empName;
  7. //部门信息
  8. private Dept dept;
  9. public void setEmpNo(String empNo) {
  10. this.empNo = empNo;
  11. }
  12. public void setEmpName(String empName) {
  13. this.empName = empName;
  14. }
  15. public void setDept(Dept dept) {
  16. this.dept = dept;
  17. }
  18. @Override
  19. public String toString() {
  20. return "Employee{" +
  21. "empNo='" + empNo + '\'' +
  22. ", empName='" + empName + '\'' +
  23. ", dept=" + dept +
  24. '}';
  25. }
  26. }

135876b39f5388c957d95884fd99722d.png

bean.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. https://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="employee" class="org.example.Employee">
  7. <property name="empNo" value="001"></property >
  8. <property name="empName" value="小王"></property >
  9. <property name="dept">
  10. <!--内部bean-->
  11. <bean class="org.example.Dept">
  12. <property name="deptNo" value="004"></property >
  13. <property name="deptName" value="技术部"></property >
  14. </bean>
  15. </property >
  16. </bean>
  17. </beans>

658939cdc3f87f4a4f5fc7ce9efd131c.png

执行:

  1. package org.example;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6. public class Main
  7. {
  8. private static final Log LOGGER = LogFactory.getLog(Main.class);
  9. public static void main(String[] args)
  10. {
  11. //获取 ApplicationContext 容器
  12. ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
  13. //获取名为 employee 的 Bean
  14. Employee employee = context.getBean("employee", Employee.class);
  15. //通过日志打印信息
  16. LOGGER.info(employee.toString());
  17. System.out.println(employee.toString());
  18. }
  19. }

57b38c5ea69d5c7cd24ae51c5915abda.png

执行结果:

d227efca3cc77f9264e6beddbc125f45.png

=================================================================================

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

#

setter 方式注入内部 Bean

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

d3821171e17e83dae55ea50d07b6b819.png

注意: 内部 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


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24



package 
net.biancheng.c;


public 
class 
Dept {


    
//部门编号


    
private 
String deptNo;


    
//部门名称


    
private 
String deptName;


    
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 + ‘\
‘’ 
+


                
‘}’
;


    
}


}

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









1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31



package 
net.biancheng.c;


public 
class 
Employee {


    
//员工编号


    
private 
String empNo;


    
//员工姓名


    
private 
String empName;


    
//部门信息


    
private 
Dept dept;


    
public 
void 
setEmpNo(String empNo) {


        
this
.empNo = empNo;


    
}


    
public 
void 
setEmpName(String empName) {


        
this
.empName = empName;


    
}


    
public 
void 
setDept(Dept dept) {


        
this
.dept = dept;


    
}


    
@Override


    
public 
String toString() {


        
return 
“Employee{“ 
+


                
“empNo=’” 
+ empNo + ‘\
‘’ 
+


                
“, empName=’” 
+ empName + ‘\
‘’ 
+


                
“, dept=” 
+ dept +


                
‘}’
;


    
}


}

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

06fac1aaf28fe73136df62a2827b12cc.png

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

fbe47f9f9a6c43f08dc7ee350f8e98b6.png

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

4bf03af44cfcc2d197398a63d5ac478b.png

发表评论

表情:
评论列表 (有 0 条评论,194人围观)

还没有评论,来说两句吧...

相关阅读