spring——Spring自动装配(转载)

骑猪看日落 2023-09-29 10:42 92阅读 0赞

我们把 Spring 在 Bean 与 Bean 之间建立依赖关系的行为称为“装配”。

Spring 的 IOC 容器虽然功能强大,但它本身不过只是一个空壳而已,它自己并不能独自完成装配工作。

需要我们主动将 Bean 放进去,并告诉它 Bean 和 Bean 之间的依赖关系,它才能按照我们的要求完成装配工作。

在前面的学习中,我们都是在 XML 配置中通过 中的 ref 属性,手动维护 Bean 与 Bean 之间的依赖关系的。

例如,一个部门(Dept)可以有多个员工(Employee),而一个员工只可能属于某一个部门,这种关联关系定义在 XML 配置的 Bean 定义中,形式如下。

83304477695508766aea05e7cc518d72.png

对于只包含少量 Bean 的应用来说,这种方式已经足够满足我们的需求了。

但随着应用的不断发展,容器中包含的 Bean 会越来越多,Bean 和 Bean 之间的依赖关系也越来越复杂,这就使得我们所编写的 XML 配置也越来越复杂,越来越繁琐。

我们知道,过于复杂的 XML 配置不但可读性差,而且编写起来极易出错,严重的降低了开发人员的开发效率。

为了解决这一问题,Spring 框架还为我们提供了“自动装配”功能。

#

#

#

Spring 自动装配

Spring 的自动装配功能可以让 Spring 容器依据某种规则(自动装配的规则,有五种),

为指定的 Bean 从应用的上下文(AppplicationContext 容器)中查找它所依赖的 Bean,并自动建立 Bean 之间的依赖关系。

而这一过程是在完全不使用任何 元素 ref 属性的情况下进行的。

Spring 的自动装配功能能够有效地简化 Spring 应用的 XML 配置,因此在配置数量相当多时采用自动装配降低工作量。

Spring 框架式默认不支持自动装配的,要想使用自动装配,则需要对 Spring XML 配置文件中 元素的 autowire 属性进行设置。

a6e8249ab6742ddf8940ac451dc648af.png

#

#

#

#

#

自动装配规则

Spring 共提供了 5 中自动装配规则,它们分别与 autowire 属性的 5 个取值对应,具体说明如下表。




























属性值 说明
byName 按名称自动装配。
Spring 会根据的 Java 类中对象属性的名称,在整个应用的上下文 ApplicationContext(IoC 容器)中查找。若某个 Bean 的 id 或 name 属性值与这个对象属性的名称相同,则获取这个 Bean,并与当前的 Java 类 Bean 建立关联关系。
byType 按类型自动装配。
Spring 会根据 Java 类中的对象属性的类型,在整个应用的上下文 ApplicationContext(IoC 容器)中查找。若某个 Bean 的 class 属性值与这个对象属性的类型相匹配,则获取这个 Bean,并与当前的 Java 类的 Bean 建立关联关系。
constructor 与 byType 模式相似,不同之处在与它应用于构造器参数(依赖项),如果在容器中没有找到与构造器参数类型一致的 Bean,那么将抛出异常。
其实就是根据构造器参数的数据类型,进行 byType 模式的自动装配。
default 表示默认采用上一级元素 <beans> 设置的自动装配规则(default-autowire)进行装配。
no 默认值,表示不使用自动装配,Bean 的依赖关系必须通过 <constructor-arg>和 <property> 元素的 ref 属性来定义。

示例

下面,我们就通过一个简单的实例,对 Spring 的自动装配功能进行演示。

  1. 参看《第一个 Spring 程序》,新建一个名为 my-spring-autowire-demo 的 Java 项目。
  2. 在 net.biancheng.c 包下,创建一个名为 Dept 的类,代码如下。

    package net.biancheng.c;

    public class Dept {

    1. //部门编号
    2. private String deptNo;
    3. //部门名称
    4. private String deptName;
    5. public Dept() {
    6. System.out.println("正在执行 Dept 的无参构造方法>>>>");
    7. }
    8. public Dept(String deptNo, String deptName) {
    9. System.out.println("正在执行 Dept 的有参构造方法>>>>");
    10. this.deptNo = deptNo;
    11. this.deptName = deptName;
    12. }
    13. public void setDeptNo(String deptNo) {
    14. System.out.println("正在执行 Dept 的 setDeptNo 方法>>>>");
    15. this.deptNo = deptNo;
    16. }
    17. public void setDeptName(String deptName) {
    18. System.out.println("正在执行 Dept 的 setDeptName 方法>>>>");
    19. this.deptName = deptName;
    20. }
    21. public String getDeptNo() {
    22. return deptNo;
    23. }
    24. public String getDeptName() {
    25. return deptName;
    26. }
    27. @Override
    28. public String toString() {
    29. return "Dept{" +
    30. "deptNo='" + deptNo + '\'' +
    31. ", deptName='" + deptName + '\'' +
    32. '}';
    33. }

    }

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

    package net.biancheng.c;

    public class Employee {

    1. //员工编号
    2. private String empNo;
    3. //员工姓名
    4. private String empName;
    5. //部门信息
    6. private Dept dept;
    7. public Employee() {
    8. System.out.println("正在执行 Employee 的无参构造方法>>>>");
    9. }
    10. public Employee(String empNo, String empName, Dept dept) {
    11. System.out.println("正在执行 Employee 的有参构造方法>>>>");
    12. this.empNo = empNo;
    13. this.empName = empName;
    14. this.dept = dept;
    15. }
    16. public void setEmpNo(String empNo) {
    17. System.out.println("正在执行 Employee 的 setEmpNo 方法>>>>");
    18. this.empNo = empNo;
    19. }
    20. public void setEmpName(String empName) {
    21. System.out.println("正在执行 Employee 的 setEmpName 方法>>>>");
    22. this.empName = empName;
    23. }
    24. public void setDept(Dept dept) {
    25. System.out.println("正在执行 Employee 的 setDept 方法>>>>");
    26. this.dept = dept;
    27. }
    28. public Dept getDept() {
    29. return dept;
    30. }
    31. public String getEmpNo() {
    32. return empNo;
    33. }
    34. public String getEmpName() {
    35. return empName;
    36. }
    37. @Override
    38. public String toString() {
    39. return "Employee{" +
    40. "empNo='" + empNo + '\'' +
    41. ", empName='" + empName + '\'' +
    42. ", dept=" + dept +
    43. '}';
    44. }

    }

b41fe0b0a86ffc4a0dd71ce15aef0bd3.png

8e80ba9702dacb1fbe3f44c3ed6f1ee1.png

3c149eba2ac4242dbfe7d6c38d7c5de8.png

09a739d8be0e0f0d1100e2068af6a265.png

3446b474784a85f428d3179c81c5bab2.png

3149b49545adb39a05e7a79531c1dac9.png

326c0182b997edc2f94b3335aa0de3c8.png

67f7b609745b2424d16e0850266818da.png

4b9becf81c55056c5c8bbffd5a281eb0.png

3b8e03fc9bdf8f887ef13204d9ad9c4b.png

9de17db3bcb7297c16a55b72f56aa47f.png

2f4a38f4317cad80fe20c4bd16a2c718.png

330b187fb7509812c88fc0ea3a21da89.png

f7e56733619be8e32180939f0562bfc4.png

fbb9e9f464ed8bd6013feceab536956d.png

发表评论

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

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

相关阅读

    相关 自动装配bean

    1.通过autowire中的byName实现自动装配 自动与set方法set后面的名字相同的bean的id匹配 注意:id必须上下文唯一,且和自己对象中set方法后边

    相关 【Spring】自动装配

    自动装配 Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值 1)、@Autowired:自动注入 默认优先按照类型去容器中找对应