Spring IOC(控制反转)思想笔记

IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码。

案例

如果按照之前javaweb的固定方法,写一个简单的业务逻辑

  1. 一个DAO接口

    public interface UserDao {
    public void getUser();
    }
    • 1
    • 2
    • 3
  2. 实现DAO接口

    public class UserDaoImpl implements UserDao {
    @Override
    public void getUser() {
    System.out.println("获取用户数据");
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  3. 一个service接口

    public interface UserService {
    public void getUser();
    }
    • 1
    • 2
    • 3
  4. 实现service接口

    public class UserServiceImpl implements UserService {
    private UserDao userDao = new UserDaoImpl(); @Override
    public void getUser() {
    userDao.getUser();
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  5. 测试类

    @Test
    public void test(){
    UserService service = new UserServiceImpl();
    service.getUser();
    }
    • 1
    • 2
    • 3
    • 4
    • 5

    这些是原来方式编写的基本步骤,如果现在增加需求,在UserServiceImpl中不是需要UserDaoImpl,而是一个新的实现了UserDao接口的UserDaoMySqlImpl

  6. 新增UserDaoMySqlImpl实现UserDao接口

    public class UserDaoMySqlImpl implements UserDao {
    @Override
    public void getUser() {
    System.out.println("MySql获取用户数据");
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果要去使用这个UserDaoMySqlImpl的话,就需要在UserServiceImpl中修改代码

  7. 修改UserServiceImpl

    public class UserServiceImpl implements UserService {
    private UserDao userDao = new UserDaoMySqlImpl();//修改部分 @Override
    public void getUser() {
    userDao.getUser();
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  8. 如果再增加一个UserDaoOracleImpl

    public class UserDaoOracleImpl implements UserDao {
    @Override
    public void getUser() {
    System.out.println("Oracle获取用户数据");
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果又要使用这个dao,则又需要去service中改变代码,假设项目十分庞大,修改一个dao可能涉及几十几百行代码,我们的工作量就会非常大,程序耦合性也非常高。

如何解决问题

  1. 在UserServiceImpl中增加一个set方法

    public class UserServiceImpl implements UserService {
    private UserDao userDao;
    // 利用set方法,让调用者自行选择需要的dao
    public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
    } @Override
    public void getUser() {
    userDao.getUser();
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 新的测试类
    @Test
    public void test(){
    UserServiceImpl service = new UserServiceImpl();
    service.setUserDao( new UserDaoMySqlImpl() );//自行选择UserDaoMySqlImpl
    service.getUser();
    //如果又要用UserDaoOracleImpl,也是可以由调用者自行选择
    //service.setUserDao( new UserDaoOracleImpl() );
    //service.getUser();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

之前所有的改变都是有程序员去控制,现在将改变的主动权交给了调用者/用户,程序也不用去管怎么创建和调用了,使得程序员可以专心实现业务,只实现一个提供服务的接口,不再管理对象的创建,也降低了代码之间的耦合度,当需求改变时也不必修改大量代码

IOC思想

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。

控制反转:可以理解为控制 对象创建 的 主动权 反转了。原来对象创建要由我们编写的程序控制,主动权在程序手里,控制反转后就将创建对象的主动权移交给第三方,这样可以降低程序代码间的耦合性,减少了修改代码的工作量。

在Spring中,IOC思想的体现就是依赖注入,在xml文件中或者使用注解创建对象交由IOC容器管理,之后获取对象就不再通过new 对象,而是通过配置文件从IOC容器中获取对象,之后修改就不需要改动程序,而只需要在xml配置文件中进行修改 ,将对象交由Spring去创建、管理、装配。

原文章:https://blog.csdn.net/L_GRAND_ORDER/article/details/112136702

Spring IOC(控制反转)思想笔记的更多相关文章

  1. Spring IoC控制反转创建实例

    Spring IoC控制反转创建实例写一个配置文件beans.xml,配置文件的约束可以访问:完整链接:https://repo.spring.io/libs-release-local/org/sp ...

  2. 学习Spring IOC控制反转和DI依赖注入总结

    30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...

  3. Spring IOC - 控制反转(依赖注入) - 入门案例 - 获取对象的方式 - 别名标签

    1. IOC - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交 由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周 ...

  4. [Spring]IOC控制反转和DI依赖注入

    从之前算起到现在接触Spring也已经有几天了,进度也不是很快,就只弄懂了控制反转和依赖注入那么一点东西.然后敲了两个demo 主要是因为之前没有学过,然后网上资源很多但是都不是面向我们初学者的,大多 ...

  5. Spring IOC(控制反转)详解及示例

    控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.你可以认为IoC与JN ...

  6. spring IOC --- 控制反转(依赖注入)----简单的实例

    IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的 ...

  7. 一) Spring 介绍、IOC控制反转思想与DI依赖注入

    一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...

  8. Spring IOC - 控制反转(依赖注入) - 单例和多例

    Spring容器管理的bean在默认情况下是单例的,即一个bean只会创建一个对象,存在map中,之后无论获取多少次该bean,都返回同一个对象. Spring默认采用单例方式,减少了对象的创建,从而 ...

  9. Spring IOC - 控制反转(依赖注入) - 配置初始化和销毁的方法

    在Spring中如果某个bean在初始化之后,或销毁之前要做一些额外操作可以为该bean配置初始化和销毁的我方法,在这些方法中完成需要的功能. 实验: 通过断点调试模式,测试初始化方法和销毁方法的执行 ...

随机推荐

  1. Win64 驱动内核编程-12.回调监控进线程创建和退出

    回调监控进线程创建和退出 两个注册回调的函数:PsSetCreateProcessNotifyRoutine   进程回调PsSetCreateThreadNotifyRoutine    线程回调分 ...

  2. Schema的快速入门

    Schema的快速入门 如果是简单元素直接  <element name="" type=""></element> Schema开发过 ...

  3. 006-Java的访问权限控制符和包导入机制

    目录 一.Java的访问权限控制符 一.访问控制符的作用 二.访问控制符的分类 二.Java的包导入机制 一.为什么要使用package? 二.package怎么用? 三.对于带有package的ja ...

  4. mysql搭建多主一从源复制环境

    问题描述:搭建过一主多从的环境,由于数据库数据一致性要求高,有些情景会搭建一主多从的架构,搭建多主一从的模式,相对来说适合数据整合,将多个业务的库整合到一起,方便做查询,也可以当做一个监控其他主库数据 ...

  5. 分布式锁为什么要选择Zookeeper而不是Redis?

    在分布式的应用中,为了防止单点故障,保障高可用,通常会采用主从结构,当主节点挂掉后,从节点可以代替主节点提供服务. Redis通过复制 + sentinel哨兵来实现主从模式. Zookeeper通过 ...

  6. 狄克斯特拉(Dijkstra)算法

    引入 从A点到B点的最短路径是什么?求最短路径的两种算法:Dijkstra算法和Floyd算法. 网图:带权图. 非网图最短路径:两顶点间经过的边数最少的路径.(非网图也可被理解为各边权值为1的网图. ...

  7. C#是怎么跑起来的

    解释流程前,需要了解一些基本的概念. 基本概念解释: CPU :中央处理器,计算机的大脑,内部由数百万至数亿个晶体管组成,是解释和运行最终转换成机器语言(二进制代码)的地方.机器语言是通过CPU内存的 ...

  8. 读HikariCP源码学Java(一)-- 通过ConcurrentBag类学习并发编程思想

    前言 ConcurrentBag是HikariCP中实现的一个池化资源的并发管理类.它是一个高性能的生产者-消费者队列. ConcurrentBag的并发性能优于LinkedBlockingQueue ...

  9. 如何使用GoLand debug

    debug 常用操作 /* 如何使用 goland debug goroutine */ package main import ( "fmt" "runtime&quo ...

  10. [bug] Hive:map.xml could only be replicated to 0 nodes instead of minReplication (=1). There are 0 datanode(s) running and no node(s) are excluded in this operation.

    原因: datanode未运行,重启hdfs