Spring 6【DI的两种方式、自动注入】(四)-全面详解(学习总结---从入门到深化)

 

目录

八、DI的两种方式

九、自动注入


八、DI的两种方式

IoC是由IoC容器帮助实例化Bean,并且在IoC容器内部注入关联属性(对象)的过程。 在上面演示的都是如何实例化Bean,下面演示的是如果给Bean注入属性。也就是说在讲解IoC/DI的另 一半功能。

在前面讲解DI时,官方文档明确说明了DI有两种方式。官网说明如下:

翻译过来,就是下图效果:

 

1. 构造注入 

构造注入要求必须在Bean中提供有参构造方法(无参数最好也提供上,这个位置不用。但是其他位置如果没有通过构造注入,默认是调用无参构造。

1.1 检查Bean类中是否有有参构造方法

检查com.bjsxt.pojo.People是否有有参构造方法,并且注意构造方法参数列表类型和参数顺序。

public class People {
      private int id;
      private String name;
      // 无参数构造
   public People() {}
   // 有参构造
   public People(int id, String name) {
     this.id = id;
     this.name = name;
   }
// getter/setter 没有粘贴到文档中
}

1.2 配置bean

在配置文件applicationContext.xml中可以通过的子标签设置构造方法中一个参数的值。

 解释说明:

constructor-arg 里面有5个属性,这5个属性分为2类。

(1)用来确定给哪个属性进行赋值

name:参数名称

index:参数索引。从0开始算起。

type:参数类型。8大基本数据类型可以直接写关键字。其他类型需要写类型的全限定路径。 这三个属性如果只需要用到一个就能精确的告诉Spring,要设置的构造方法参数是哪个可以使用一 个。如果无法精确到某个构造方法参数,可以多个一起结合使用。

(2)设置属性的值

value:简单数据类型直接设置。Spring会自动进行类型转换。

ref:需要引用另一个bean的id。也就是说这个参数是一个类类型,且这个类的对象也被Spring 容器管理。

 下面代码使用了type进行确认到底给构造方法哪个参数赋值。也可以尝试使用其他的属性来确认参数。

<bean id="peo4" class="com.tong.pojo.People">
    <constructor-arg type="int" value="1"></constructor-arg>
    <constructor-arg type="java.lang.String" value="张三"></constructor-arg>
</bean>

1.3 编写测试类并观察控制台运行结果

/*
DI构造注入
*/
@Test
void constructorDI(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    People peo4 = context.getBean("peo4", People.class);
    System.out.println(peo4);
}

控制台输出结果包含了配置的值

2.设值注入(setter注入) 

2.1 检查Bean类中是否有Setter方法

Setter注入一般都是结合无参构造方法一起使用。所以类中有无参构造方法。

package com.tong.pojo;
public class People {
     private int id;
     private String name;
     public People() {}
     public People(int id, String name) {
           this.id = id;
           this.name = name;
       }

     public int getId() {
            return id;
      }
     public void setId(int id) {
            this.id = id;
      }
     public String getName() {
            return name;
      }
     public void setName(String name) {
           this.name = name;
      }
    @Override
    public String toString() {
            return "People{" + "id=" + id + ", name='" + name + '\'' + '}';
       }
}

1.2 配置Bean

重新配置了一个bean标签,并设置id=“peo5”。

通过 标签调用类的setter方法。

1、name:属性名称。

2、value:属性值。

3、ref:引用另一个bean标签的id属性。

<bean id="peo5" class="com.tong.pojo.People">
   <property name="id" value="2"></property>
   <property name="name" value="李四"></property>
</bean>

1.3 编写测试类并观察控制台结果

在测试类中获取peo5的bean,并输出到控制台,查看是否包含设置的值。

3.构造注入和设值注入的混合使用

也可以让构造注入和设值注入混合使用。这两种方式只要保证有对应的构造方法和setter方法,就可以 使用其中一种方式设置部分属性的值。

先保证People中有一个参数的构造方法,并且包含name属性的setter方法。

package com.tong.pojo;
public class People {
     private int id;
     private String name;
     public People() {}
    // 只有id属性的构造方法
     public People(int id) {
            this.id = id;
      }
     public People(int id, String name) {
            this.id = id;
            this.name = name;
       }
     // getter/setter 没有粘贴到文档中
     public int getId() {
            return id;
       }
     public void setId(int id) {
            this.id = id;
       }
     public String getName() {
           return name;
      }
     public void setName(String name) {
          this.name = name;
      }
    @Override
    public String toString() {
           return "People{" + "id=" + id + ", name='" + name + '\'' + '}';
   }
}

在配置文件中混合使用两种方式

<bean id="peo6" class="com.tong.pojo.People">
    <constructor-arg index="0" value="3"></constructor-arg>
    <property name="name" value="王五"></property>
</bean>

在测试类中获取peo5的bean,并输出到控制台,查看是否包含设置的值。

4.不同属性类型对应的写法

前面在讲解DI两种实现方式时,属性都是简单数据类型。如果类的属性是数组、集合、对象等类型需要 通过下面方式进行设置。 这些标签都是或的子标签。

一旦使用了下面子标签方式,就不能对 或 设置value属性或ref属 性。且需要在People类中提供对应名称,对应类型的属性。下面示例中没有粘贴People类提供对应类 型,对应名称属性的代码。

4.1 引用其他Bean

如果需要引用其他Bean,直接在property标签中使用ref引用就可以。使用子标签ref也可以,但是没有直接用ref属性的方式简单。

<bean id="tea" class="com.tong.pojo.Teacher"></bean>
    <bean id="peo7" class="com.tong.pojo.People">
    <property name="teacher" ref="tea"></property>
</bean>

4.2 Set类型

<bean id="peo7" class="com.tong.pojo.People">
    <property name="hover">
     <set>
       <value>童小纯</value>
       <value>听smallming</value>
    </set>
   </property>
</bean>

4.3 List类型

<bean id="peo7" class="com.tong.pojo.People">
   <property name="subjects">
    <list>
      <value>java</value>
      <value>前端</value>
   </list>
  </property>
</bean>

4.4 Array类型

<bean id="peo7" class="com.tong.pojo.People">
   <property name="teachers">
     <array>
       <value>小童</value>
       <value>张佳明</value>
     </array>
   </property>
</bean>

4.5 Map类型

<bean id="peo7" class="com.tong.pojo.People">
   <property name="phone">
    <map>
      <entry key="姓名" value="18612345678"></entry>
    </map>
  </property>
</bean>

4.6 Prop值类型

Prop就是Properties类型。Properties是HashTable的子类型。内容满足Key-value。

<bean id="peo7" class="com.tong.pojo.People">
   <property name="properties">
     <props>
        <prop key="a">a1</prop>
        <prop key="b">b1</prop>
     </props>
   </property>
</bean>

4.7 Null值类型

<bean id="peo7" class="com.tong.pojo.People">
    <property name="phone">
      <null></null>
    </property>
</bean>

九、自动注入

在Spring中,允许Bean的自动注入。有两种方式进行配置。

1、在根标签 中配置default-autowire属性。标签整个Spring中自动注入的策略。可取值有5 个。

2、default:默认值。不自动注入。

3、no:不自动注入。

4、byName:通过名称自动注入。会自动寻找容器中与当前属性同名的bean进行注入。

5、byType:通过类型自动注入。会自动寻找容器中与当前bean类型匹配的bean进行注入。如果有多 个相同类型的bean注入会出现异常。

6、constructor:通过构造方法进行注入。寻找bean的构造方法中是否有一个包含其他bean类型的参 数。如果有自动注入进去。类型先byType后byName,如果没找到不注入。注:构造方法类型和其 他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
https://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byName">
<bean id="peo" class="com.tong.pojo.People" ></bean>
</beans>

在 标签中配置autowire属性。和default-autowire取值相同。唯一注意default表示全局 default-autowire的值。如果autowire和default-autowire同时存在,autowire生效。

<bean id="peo" class="com.tong.pojo.People" autowire="byType"></bean>

小提示: 自动注入指的都是bean之间的自动注入。能够自动注入必须保证Spring 容器中包含能被自动注入的bean

猜你喜欢

转载自blog.csdn.net/m0_58719994/article/details/131796891
今日推荐