Spring框架--Spring入门实验二之依赖注入

本文详细介绍了Spring框架中的依赖注入,包括setter注入、构造器注入以及如何为类类型属性(如对象注入)和数组类型属性赋值,旨在帮助开发者理解并实践Spring的解耦和灵活性。
摘要由CSDN通过智能技术生成

目录

引言

1、依赖注入之setter注入

2、依赖注入之构造器注入

3、为类类型属性赋值(依赖注入之对象注入)

4、为数组类型属性赋值


引言

Spring框架中的依赖注入(Dependency Injection,DI)是一种设计模式和编程实践,它通过反转控制(Inversion of Control, IoC)实现组件之间的解耦。在传统的对象创建过程中,一个类通常需要自己创建并管理对其他类的引用,这会导致高度耦合。而依赖注入则是由一个第三方容器(IOC容器)负责创建对象,并将这些对象所依赖的对象实例作为构造函数参数、setter方法或字段直接注入到目标对象中。

在Spring框架中,依赖注入可以通过构造函数注入、Setter方法注入或字段注入来实现。通过依赖注入,开发人员可以将对象之间的依赖关系配置在Spring容器中,然后由Spring容器在运行时动态地将依赖关系注入到对象中,从而实现对象之间的解耦和灵活的管理。这样可以使得代码更加模块化和易于扩展,同时也方便进行单元测试和集成测试。

1、依赖注入之setter注入

①创建学生类Student

public class Student {

    private Integer id;
    
    private String name;
    
    private Integer age;
    
    private String sex;
    
    public Student() {
    }
    
    public Integer getId() { 
    	return id;
    }
    
    
    public void setId(Integer id) { 
    	this.id = id;
    }
    
    
    public String getName() { 
    	return name;
    }
    
    
    public void setName(String name) { 
    	this.name = name;
    }
    
    
    public Integer getAge() { 
    	return age;
    }
    
    
    public void setAge(Integer age) { 
    	this.age = age;
    }
    
    
    public String getSex() { 
    	return sex;
    }
    
    
    public void setSex(String sex) { 
    	this.sex = sex;
    }
    
    @Override
    public String toString() { 
    	return "Student{" + "id=" + id + ", name='" + name + ", age=" + age + ", sex='" + sex }';
    }
}

②配置bean时为属性赋值

property标签就是通过组件类的setXxx()方法给对象设置属性,在运行时容器会动态地将依赖关系注入到对象。

<bean id="studentOne" class="com.softeem.bean.Student">
    <!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 -->
    <!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关)
    -->
    <!-- value属性:指定属性值 -->
    <property name="id" value="1001"></property>
    <property name="name" value="张三"></property>
    <property name="age" value="23"></property>
    <property name="sex" value="男"></property>
</bean>

③测试

getBean()方法里面的参数一定要配置文件中bean标签中的id一致

@Test
public void studentTest(){
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    Student student = ac.getBean("studentOne", Student.class);
    System.out.println("student = " + student);
}

2、依赖注入之构造器注入

①在Student类中添加有参构造

public Student(Integer id, String name, Integer age, String sex) { 
    this.id = id;
    this.name = name; 
    this.age = age; 
    this.sex = sex;
}

②配置bean

 <bean id="studentTwo" class="com.softeem.bean.Student">
     <constructor-arg value="1002"></constructor-arg>
     <constructor-arg value="李四"></constructor-arg>
     <constructor-arg  value="33"></constructor-arg>
     <constructor-arg  value="女"></constructor-arg>
  </bean>

注意:

constructor-arg标签还有两个属性可以进一步描述构造器参数:

index属性:指定参数所在位置的索引(从0开始)

name属性:指定参数名

③测试

@Test
public void testDIBySet(){
	ApplicationContext ac = new ClassPathXmlApplicationContext("spring-di.xml"); 
    Student studentOne = ac.getBean("studentTwo", Student.class); 
    System.out.println(studentOne);
}

3、为类类型属性赋值(依赖注入之对象注入)

①创建班级类Clazz

public class Clazz {

    private Integer clazzId;
    
    private String clazzName;
    
    public Integer getClazzId() { 
    	return clazzId;
    }    
    
    public void setClazzId(Integer clazzId) { 
    	this.clazzId = clazzId;
    }
      
    public String getClazzName() { 
    	return clazzName;
    }
        
    public void setClazzName(String clazzName) { 
    	this.clazzName = clazzName;
    }
        
    @Override
    public String toString() { 
        return "Clazz{" +
        "clazzId=" + clazzId +
        ", clazzName='" + clazzName + '}';
    }
     
    public Clazz() {
    }
   
    public Clazz(Integer clazzId, String clazzName) { 
        this.clazzId = clazzId;
        this.clazzName = clazzName;
    }
}

②修改Student类

在Student类中添加班级类属性及get、set方法。

为类类型属性赋值方式一:引用外部已声明的bean

配置Clazz类型的bean:

<bean id="clazzOne" class="com.softeem.bean.Clazz">
  <property name="clazzId" value="1111"></property>
  <property name="clazzName" value="财源滚滚班"></property>
</bean>

为Student中的clazz属性赋值:

<bean id="studentFour" class="com.softeem.spring.bean.Student">
  <property name="id" value="1004"></property>
  <property name="name" value="赵六"></property>
  <property name="age" value="26"></property>
  <property name="sex" value="女"></property>
  <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
  <property name="clazz" ref="clazzOne"></property>
</bean>

<property name="clazz" ref="clazzOne"></property> 就是property为clazz属性赋值,但此处不能用value进行赋值而要使用ref,对Clazz类型的bean参考。可以看到ref属性的值就是Clazz类型bean的id。

为类类型属性赋值方式二:内部bean

<bean id="studentFour" class="com.softeem.bean.Student">
  <property name="id" value="1004"></property>
  <property name="name" value="赵六"></property>
  <property name="age" value="26"></property>
  <property name="sex" value="女"></property>
  <property name="clazz">
  <!-- 在一个bean中再声明一个bean就是内部bean -->
  <!-- 内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性 -->
  <bean class="com.softeem.bean.Clazz">
    <property name="clazzId" value="2222"></property>
    <property name="clazzName" value="远大前程班"></property>
  </bean>
  </property>
</bean>

为类类型属性赋值方式三:级联属性赋值(用的极少)

<bean id="studentFour" class="com.softeem.spring.bean.Student">
  <property name="id" value="1004"></property>
  <property name="name" value="赵六"></property>
  <property name="age" value="26"></property>
  <property name="sex" value="女"></property>
  <!-- 一定先引用某个bean为属性赋值,才可以使用级联方式更新属性 -->
  <property name="clazz" ref="clazzOne"></property>
  <property name="clazz.clazzId" value="3333"></property>
  <property name="clazz.clazzName" value="最强王者班"></property>
</bean>

4、为数组类型属性赋值

这个简单,只用在property标签中增加array标签即可,然后在value属性赋值:

<property name="hobbies">
  <array>
    <value>抽烟</value>
    <value>喝酒</value>
    <value>烫头</value>
  </array>
</property>

综上就是Spring框架中IOC容器依赖注入的几种方法。

spring框架概述及第一个入门实验见作者spring框架专栏中https://blog.csdn.net/m0_66111719/article/details/135839708?spm=1001.2014.3001.5501

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值