Spring基础学习之IOC理论推导

本文介绍了Spring框架的基础知识,重点讲解了IOC(控制反转)的概念和作用。通过实例展示了传统模式下业务层主动创建DAO对象的问题,然后引入IOC,通过setter注入实现了对象创建的控制反转,降低了代码耦合。最后,演示了如何使用Spring的XML配置文件进行Bean的创建和管理,从而实现依赖注入。
摘要由CSDN通过智能技术生成

前言

小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。
这个Spring基础学习系列是用来记录我学习Spring框架基础知识的全过程 (这个系列是参照B站狂神的Spring5最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!)
之后我将会以一天一更的速度更新这个系列,还没有学习Spring5框架的小伙伴可以参照我的博客学习一下;当然学习过的小伙伴,也可以顺便跟我一起复习一下基础。
最后,希望能够和大家一同进步吧!加油吧!少年们!
废话不多说,让我们开始今天的学习内容吧,今天我们来到了Spring基础学习的第二站:IOC理论推导!

2.IOC理论推导

2.1常规模式

2.1.1 编写UserDao 接口及其实现类

1.编写UserDao接口
package com.kuang.dao;
public interface UserDao {
    void getUser();
}
2.编写UserDaoImpl实现类
package com.kuang.dao;
public class UserDaoImpl implements UserDao{
    public void getUser() {
        System.out.println("默认获取用户的数据");
    }
}
3.编写UserDaoMysqlImpl实现类
package com.kuang.dao;
public class UserDaoMysqlImpl implements UserDao{
    public void getUser() {
        System.out.println("Mysql获取用户数据!");
    }
}
4.编写UserDaoOracleImpl实现类
package com.kuang.dao;
public class UserDaoOracleImpl implements UserDao {
    public void getUser() {
        System.out.println("Oracle获取用户数据!");
    }
}
5.编写UserDaoSqlserverImpl实现类
package com.kuang.dao;
public class UserDaoSqlserverImpl implements UserDao{
    public void getUser() {
        System.out.println("Sqlserver获取用户数据!");
    }
}

2.1.2 编写UserService 业务接口及其实现类

1.编写UserService业务接口
public interface UserService {
    void getUser();
}
2 .编写UserServiceImpl实现类
public class UserServiceImpl implements UserService{

    //业务层就做一件事情:调用DAO层去查询
    //需要主动去创建对象
    private UserDao userDao = new UserDaoImpl();
    //如果需要访问多个对象,就需要分别创建
//     private UserDao userDao1 = new UserDaoMysqlImpl();
//    private UserDao userDao2 = new UserDaoOracleImpl();
//	private UserDao userDao3 = new UserDaoSqlserverImpl();
    public void getUser() {
        userDao.getUser();
    }
}
3.执行流程

常规模式
在这里插入图片描述

4.测试结论

在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果代码量十分大,修改一次的成本十分昂贵!

2.2 使用控制反转

2.2.1 修改UserServiceImpl实现类

我们使用一个Set接口实现,已经发生了革命性的变化

public class UserServiceImpl implements UserService{
private UserDao userDao; //引入userDao对象
    //利用set进行动态实现值的注入 
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    public void getUser() {
        userDao.getUser();
    }
}

2.2.2 编写MyTest测试类

package com.kuang.dao;
//测试方法
public class MyTest {
    public static void main(String[] args) {
        //用户实际调用的是业务层,dao层他们不需要接触!
        UserService userService = new UserServiceImpl();
        //由主动创建对象被动接受对象,这就是控制反转(IOC)
        ((UserServiceImpl) userService).setUserDao(new UserDaoImpl());
//        ((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
//      ((UserServiceImpl) userService).setUserDao(new UserDaoOracleImpl());
//        ((UserServiceImpl) userService).setUserDao(new UserDaoSqlserverImpl());
        userService.getUser();
    }
}

2.2.3 执行流程

控制反转
在这里插入图片描述

2.2.4 测试结果

在这里插入图片描述

2.2.5 测试结论

  • 之前,程序是主动创建对象!控制权在程序员手上

  • 使用set注入后,程序不再具有主动性,而是变成了被动的接收对象!

  • 这种思想,本质上解决了问题,我们程序员不用再去管理对象的创建了(把主动权交给用户),系统的耦合性大大降低,可以更加专注的在业务的实现上!这就是IOC的原型!

2.3 IOC本质

2.3.1 IOC和DI概念了解

  • 控制反转IOCInversion of Control),是一种设计思想,依赖注入DI(Dependency Injection)是实现IOC的一种方法(DI也可以理解为IOC的另一种说法)。没有IOC的程序中,使用面向对象编程,对象的创建与对象的依赖关系完全编码在程序中,对象的创建由程自己控制,控制反转后将对象的创建转移给第三方,其实所谓控制就是:获得依赖对象的方式反转了

2.3.2 IOC的实现方式

  • IOC是Spring框架的核心内容,使用多种方式完美实现IOC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IOC

2.3.3 IOC实现过程图解

  • Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IOC容器中取出需要的对象。

在这里插入图片描述

  • 采用XML方式配置Bean的时候,Bean的定义信息和实现分离的
  • 而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

2.3.4 控制反转 IOC总结

  • 控制反转是通过一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。
  • 在Spring中实现控制反转的是IOC容器,其方法是依赖注入(Dependency Injection,DI)

2.4 使用Spring IOC容器创建管理装配

2.4.1 创建beans.xml配置文件

<?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">
     <bean id="userDaoImpl"
          class="com.kuang.dao.UserDaoImpl">
    </bean>
    <bean id="mysqlImpl"
          class="com.kuang.dao.UserDaoMysqlImpl">
    </bean>
    <bean id="oracleImpl"
          class="com.kuang.dao.UserDaoOracleImpl">
    </bean>
    <bean id="sqlserverImpl"
          class="com.kuang.dao.UserDaoSqlserverImpl">
    </bean>
    <bean id="userServiceImpl" class="com.kuang.service.UserServiceImpl">
        <!--property:接口实现类的属性
            name:接口实现类属性的名字
            ref:引用Spring容器中创建好的对象
            value:具体的路,基本数据类型-->
        <property name="userDao" ref="mysqlImpl"/>
    </bean>
</beans>

2.4.2 修改 UserServiceImpl 业务实现类

public class UserServiceImpl implements UserService{
    private UserDao userDao;
    //利用set进行动态实现值的注入
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    public void getUser() {
        userDao.getUser();
    }
}

2.4.3 重新进行方法测试

public class MyTest2 {
    public static void main(String[] args) {
        //获取ApplicationContext:拿到Spring的容器
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //容器在手,天下我有,需要什么,就直接get什么
        UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("userServiceImpl");
        userServiceImpl.getUser();
    }
}

2.4.4 测试结果

在这里插入图片描述

好了,今天的有关Spring基础学习之IOC理论推导的学习就到此结束啦,欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连,我们下期见,拜拜啦!


参考视频链接:https://www.bilibili.com/video/BV1WE411d7Dv(【狂神说Java】Spring5最新教程IDEA版通俗易懂)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂奔の蜗牛rz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值