04、Spring框架入门:SpringDI的注入方式

SpringDI的注入方式

    • 1.DI简介
  • 2.DI注入的方式
    • 1.使用有参构造器方式进行注入
    • 2.使用set方法进行注入
    • 3.自动注入
  • 3.DI其他类型值的注入
    • 1.array
    • 2.list
    • 3.set
    • 4.map
  • 5.Properties

为什么使用DI(依赖注入):

  • 作用:给创建好的对象中的全局的属性或者对象进行赋值的操作

1.DI简介

  • 英文全称(Dependency Injection)
  • 中文名称:依赖注入
    依赖:一个类在另一个类中作为全局属性时
    注入:通过外部给自己属性(或其他内容)进行
  • 类与类之间的关系:
    1、 继承(官方名称:泛化);
    2、 实现;
    3、 依赖:类和类之间的关系是偶然的,临时的.在代码层面另一个类当作这个类的方法参数或局部变量;
    4、 关联:类与类之间存在一定联系,可以是单向联系可以是双向联系.例如:学生和老师.(平时理解关联是一种强依赖),体现在代码层面,另一个类是这个类的全局属性;
    5、 聚合:类与类之间是可以单独存在的.但是有存在整体和部分的关系.例如:机箱和CPU.体现在代码层面:另一个类是这个类的全局属性;
    6、 组合:类与类之间是整体和部分之间的部分,不可分.例如人和心脏.体现在代码层面:另一个类是这个类的全局属性;
    7、 关系强度:组合>聚合>关联>依赖;
  • DI的意义
    解除类与类之间高耦合性,给对象中全局对象赋值的操作
  • 为什么称DI和IoC是同一个事情
    Spring帮助创建对象的过程叫做IoC,创建对象时给对象中全局对象赋值叫做DI,所以认为IoC和DI是同一个事情

2.DI注入的方式

1.使用有参构造器方式进行注入

    <bean id="cla" class="com.spring4.Clazz">
         <constructor-arg name="cname" value="高一(某)班"></constructor-arg
         <constructor-arg name="clazzno" value="507"></constructor-arg>
    </bean>

package com.bjsxt.spring4;

public class Clazz {
   
     

    private int clazzno;

    private String cname;

    public Clazz(int clazzno, String cname) {
   
     
        this.clazzno = clazzno;
        this.cname = cname;
    }

    public Clazz() {
   
     
    }

    public int getClazzno() {
   
     
        return clazzno;
    }

    public void setClazzno(int clazzno) {
   
     
        this.clazzno = clazzno;
    }

    public String getCname() {
   
     
        return cname;
    }

    public void setCname(String cname) {
   
     
        this.cname = cname;
    }

    @Override
    public String toString() {
   
     
        return "Clazz{" +
                "clazzno=" + clazzno +
                ", cname='" + cname + '\'' +
                '}';
    }
}

2.使用set方法进行注入

	<!--
        name:对象的属性名
        value和ref的使用场景
        value: 如果注入的属性类型是基本数据类型(包含String)使用value
        ref:如果注入的属性类型是对象这个时候使用ref
    -->
    <bean id="stu" class="com.spring4.Student">
        <property name="name" value="lisi"></property>
        <property name="sex" value="男"></property>
        <property name="age" value="20"></property>
        <property name="clazz" ref="DQCGM"></property>
    </bean>

package com.spring4;

public class Student {
   
     

    private String name;

    private String sex;

    private int age;

    private Clazz clazz;

    public Student(Clazz clazz) {
   
     
        System.out.println("--调用了有参构造---");
        this.clazz = clazz;
    }

    public Student(String name, String sex, int age, Clazz clazz) {
   
     
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.clazz = clazz;
    }

    public Student() {
   
     
    }

    public String getName() {
   
     
        return name;
    }

    public void setName(String name) {
   
     
        this.name = name;
    }

    public String getSex() {
   
     
        return sex;
    }

    public void setSex(String sex) {
   
     
        this.sex = sex;
    }

    public int getAge() {
   
     
        return age;
    }

    public void setAge(int age) {
   
     
        this.age = age;
    }

    public Clazz getClazz() {
   
     
        return clazz;
    }

    public void setClazz(Clazz clazz) {
   
     
        this.clazz = clazz;
    }

    @Override
    public String toString() {
   
     
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", clazz=" + clazz +
                '}';
    }
}

3.自动注入

	<!--
        底层走的是set方法
        byName:这个时候就会在当前的xml中寻找【bean的ID名称】和需要注入实体中的【属性名】一致,进行匹配注入
        byType:这个时候就会在当前的xml中寻找【bean标签的类型】和需要注入实体中的【属性的类型】一致,进行匹配注入
        底层走的是构造器
        constructor:这个时候首先会根据[有参构造器的形参名]名称进行查找,如果名称没有一致的,在根据类型[有参构造器的类型]进行查找
        需要注意:*在指定的类中必须提供合适的有参构造器才可以
    -->
    <bean id="stu" class="com.spring4.Student" autowire="constructor"></bean>

3.DI其他类型值的注入

1.array

    <bean id="us" class="com.spring4.User">
        <property name="arr">
            <array>
                <value>A</value>
                <value>B</value>
                <value>C</value>
            </array>
        </property>
    </bean>

2.list

    <bean id="us" class="com.spring4.User">
        <property name="li">
            <list>
                <value>A</value>
                <value>B</value>
                <value>C</value>
            </list>
        </property>
    </bean>

3.set

    <bean id="us" class="com.spring4.User">
        <property name="se">
            <set>
                <value>A</value>
                <value>A</value>
                <value>B</value>
                <value>C</value>
            </set>
        </property>
    </bean>

4.map

    <bean id="us" class="com.spring4.User">
        <property name="map">
            <map>
                <entry>
                    <key>
                        <value>A</value>
                    </key>
                    <value>1</value>
                </entry>
                <entry>
                    <key>
                        <value>B</value>
                    </key>
                    <value>1</value>
                </entry>
                <entry>
                    <key>
                        <value>C</value>
                    </key>
                    <value>1</value>
                </entry>
            </map>
        </property>
    </bean>

5.Properties

    <bean id="us" class="com.spring4.User">
		<property name="pro">
    		<props>
    			<prop key="key">value</prop>
    		</props>
    	</property>
    </bean>