Spring第一大核心思想之Ioc/DI

本文详细介绍了Spring框架中的IoC控制反转和依赖注入原理,包括基于setter方法和构造函数的依赖注入方式,通过示例展示了如何在Spring配置文件中使用bean标签进行对象注入,以及不同类型的数据注入,如对象、基本类型和复杂类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文章将介绍Spring第一大核心思想-Ioc控制反转和DI依赖注入,以及它们简单的实现案例。


一、什么是SpringIoc/DI?

  • IOC:IOC( Inversion of Control,中文释义:控制反转 ),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。指将创建对象的控制权转移给Spring框架进行管理。由Spring框架根据配置文件或注解等方式,创建bean对象并管理各个bean对象之间的依赖关系。使对象之间形成松散耦合的关系,实现解耦

    • 控制 :指的是对象创建(实例化管理)的权力
    • 反转 :控制权交给外部环境(Spring框架、IoC容器)
  • DI:DIDependecy Inject,中文释义:依赖注入),当一个对象A依赖于另一个对象B时,对象A中包含对象B的属性以及其的set方法或包含对象B的有参构造方法,在容器创建对象B时,将属性的值通过依赖注入的方式赋予,实现依赖注入。

二、依赖注入(DI)

依赖注入主要有两种常见的变体:

  • 基于 Setter 方法的依赖注入
  • 基于构造函数的依赖注入

2.1.Setter 方法的依赖注入

set注入DI实现步骤:
1.思考
2.给属性提供set方法
3.在bean标签内部开启配置
配置位置:< bean> 此位置</ bean>
配置语法:<property 属性名=“属性值”></ property>
配置属性:
name---------属性名称
value---------属性值
ref------------属性值的引用

2.1.1注入对象

public interface IUserDao {
    public void save();
}
public class UserDaoImp implements IUserDao{
    @Override
    public void save() {
        System.out.println("===dao数据访问层===");
    }
}
public interface IUserService {
     public void save();
}
public class IUserServiceImp implements IUserService{

    IUserDao iUserDao;

   public void setiUserDao(IUserDao iUserDao) {
       this.iUserDao = iUserDao;
   }

   @Override
   public void save() {
       System.out.println("===service业务逻辑层===");
       iUserDao.save();
   }
}
public interface IUserController {
    public void save();
}
public class UserControllerImp implements IUserController {

    IUserSerivce serivce;

    //set方法
    public void setSerivce(IUserSerivce serivce) {
        this.serivce = serivce;
    }

    @Override
    public void save() {
        System.out.println("===controller控制访问层===");
        serivce.save();
    }
}

beans配置

<bean id="controllerImp" class="com.apesource.controller.IUserControllerImp">
        <property name="iUserService" ref="serviceImp"></property>
    </bean>

    <bean id="serviceImp" class="com.apesource.service.IUserServiceImp">
        <property name="iUserDao" ref="daoImp"></property>
    </bean>
    <bean id="daoImp" class="com.apesource.dao.IUserDaoImp"></bean>

创建三个接口以及三个实现类,在类中为了降低耦合度,并没有直接new对象,而是通过设置将对象成员变量,以及给它设置set方法,使spring框架通过IOC创建对象,并将对象注入进属性中。

  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Beans.xml");
        IUserController iUserController = (IUserController) applicationContext.getBean("controllerImp");
        iUserController.save();

测试结果如图:

在这里插入图片描述

2.1.2注入基本类型与String

public class Student {
     private String stuName;
     private String stuHub;
     private int stuAge;

    @Override
    public String toString() {
        return "Student{" +
                "stuName='" + stuName + '\'' +
                ", stuHub='" + stuHub + '\'' +
                ", stuAge=" + stuAge +
                '}';
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public void setStuHub(String stuHub) {
        this.stuHub = stuHub;
    }

    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }
}

beans配置

 <bean id="student" class="com.apesource.pojo.Student">
        <property name="stuAge" value="18"></property>
        <property name="stuHub" value="唱跳rap篮球"></property>
        <property name="stuName" value="蔡徐昆"></property>
    </bean>
Student student = (Student) applicationContext.getBean("student");
        System.out.println(student);

测试结果如图
在这里插入图片描述

2.1.3注入复杂类型(list、map、properties…)

public class Teacher {
     private List list;
     private Set set;
     private String[] array;
     private Map map;
     private Properties prop;


    @Override
    public String toString() {
        return "Teacher{" +
                "list=" + list +
                ", set=" + set +
                ", array=" + Arrays.toString(array) +
                ", map=" + map +
                ", prop=" + prop +
                '}';
    }

    public void setList(List list) {
        this.list = list;
    }

    public void setSet(Set set) {
        this.set = set;
    }

    public void setArray(String[] array) {
        this.array = array;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public void setProp(Properties prop) {
        this.prop = prop;
    }
}

beans配置

<bean id="teacher" class="com.apesource.pojo.Teacher">
        <property name="list">
            <list>
                <value>密室逃脱</value>
                <value>桌游</value>
                <value>推本</value>
            </list>
        </property>

        <property name="array">
            <array>
                <value>篮球</value>
                <value>足球</value>
                <value>乒乓球</value>
            </array>
        </property>

        <property name="set">
            <set>
                <value>字节跳动</value>
                <value>三星</value>
                <value>阿里巴巴</value>
            </set>
        </property>

        <property name="map">
            <map>
                <entry key="及时雨" value="宋江"></entry>
                <entry key="豹子头" value="林冲"></entry>
                <entry key="两年半" value="蔡虚昆"></entry>
            </map>
        </property>

        <property name="prop">
            <props>
                <prop key="多兰剑">450</prop>
                <prop key="红水晶">400</prop>
                <prop key="布甲">300</prop>
            </props>
        </property>
    </bean>
Teacher teacher = (Teacher) applicationContext.getBean("teacher");
        System.out.println(teacher);

测试结果如图
在这里插入图片描述

2.2.构造方法注入

构造注入
要求:
类中需要提供一个对应参数列表的构造函数;
涉及的标签:
constructor-arg
属性:
index:指定参数在构造函数参数列表的索引位置
type:指定参数在构造函数中的数据类型
name:指定参数在构造函数中的名称 用这个找给谁赋值
=上面三个都是找给谁赋值,下面两个指的是赋什么值的========
value:它能赋的值是基本数据类型和 String 类型
ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean

public class Principal {
    private String priName;
    private Map classRoom;


    public Principal(String priName, Map classRoom) {
        this.priName = priName;
        this.classRoom = classRoom;
    }

    public Principal() {
    }

    @Override
    public String toString() {
        return "Principal{" +
                "priName='" + priName + '\'' +
                ", classRoom=" + classRoom +
                '}';
    }
}

beans配置

<bean id="principal" class="com.apesource.pojo.Principal">
        <constructor-arg index="0" type="java.lang.String" name="priName" value="高斯林"></constructor-arg>
        <constructor-arg index="1" type="java.util.Map" name="classRoom">
            <map>
                <entry key="德育楼" value="10层"></entry>
                <entry key="办公楼" value="5层"></entry>
                <entry key="艺术楼" value="3层"></entry>
            </map>
        </constructor-arg>
    </bean>
Principal principal = (Principal) applicationContext.getBean("principal");
        System.out.println(principal);

测试结果如图
在这里插入图片描述


总结

以上就是所有内容了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值