spring框架学习——ioc思想原型及实质(代码片段)

RAIN7 RAIN7     2023-03-13     678

关键词:

文章目录

Spring 框架学习(一)——IOC思想原型及实质


一、我们以前写业务代码的方式


1.UserDao 数据访问接口

package com.kuang.dao;

import java.util.List;
public interface UserDao 
    void selectAll();

2.UserDaoImpl Dao层实现类

package com.kuang.dao;

public class UserDaoImpl implements UserDao
    public void selectAll() 
        System.out.println("获取了用户的数据!");
    

3.UserService 业务接口

package com.kuang.service;

public interface UserService 
    void getUser();



4.UserServiceImpl 业务实现类

package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;

public class UserServiceImpl implements UserService 
    // 以前这个new Dao层实体类的代码都写到方法里面,也可以写到外面避免多次创建实例
    // 这里用到了 组合的方式
    
    private UserDao userDao = new UserDaoImpl();

    // 用户实际调用的是业务层,而不是Dao层
    // 业务层就做一个事情,调Dao层进行使用功能

    public void getUser() 
          userDao.selectAll();
    


5.测试类 用户使用业务功能

package com.kuang.test;
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;

public class Test 

 @org.junit.Test
    public void test()
     UserService userService = new UserServiceImpl();
     userService.getUser();
    

接口与具体实现类的分开有效的实现了解耦合,但是还不够方便。

举几个例子,来说明Sring为什么要使用IOC来实现控制反转,以及什么是控制反转


二、用户更改需求,代码如何改动


如果用户增加了一个使用Mysql获取用户数据的需求,在上述的方式下我们会怎么改呢?

1.创建一个其他的类实现UserDao接口,重写方法的具体代码

package com.kuang.dao;

public class UserDaoMySQLImpl implements UserDao
    public void selectAll() 
        System.out.println("MySQL获取用户数据!");
    

2.在UserServiceImpl 业务层具体实现的方法里面修改代码,使得UserDao的实现类更改成上面写的这个新的类

package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoMySQLImpl;

public class UserServiceImpl implements UserService 
    // 将接口实现的类 修改了
    private UserDao userDao = new UserDaoMySQLImpl();
    
    public void getUser() 
          userDao.selectAll();
    

3.测试具体业务功能。


以上面这个例子可以说明一个问题:

  上面的例子中,每次用户更改需求,我们都要在原代码的基础上进行修改,比如用户想要Orcale获取数据就要修改成new Orcale,想要SqlServer 获取用户数据,就要修改成 new SqlServer。

  这个例子中修改的代码还不是很多,如果真实的项目中,代码量成千上万行,有几十个类,用户的需求增加或者更改,那么就需要在很多地方修改代码,非常麻烦,开发的效率很低

上述的方式写代码,适应不了用户的需求变更,用户需求变了,要立马修改原代码,非常不好。

所以就有了另外一种写代码的具体方式


三、IOC 思想原型


在业务具体实现类这里,变更写代码的方式

package com.kuang.service;
import com.kuang.dao.UserDao;

public class UserServiceImpl implements UserService 
    // 对属性不做具体的new,交给set接口来设置,控制权直接翻转
    private UserDao userDao;

    // 使用set的方式实现了值的动态注入
    public void setUserDao(UserDao userDao) 
        this.userDao = userDao;
    

    public void getUser() 
          userDao.selectAll();
    

之前的方式是程序控制创建对象(通过new的方式定死了具体的实现对象)

现在是用户在使用不同需求时,通过set注入自己需要的对象即可实现需求。

package com.kuang.test;
import com.kuang.dao.UserDaoMySQLImpl;
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;

public class Test 

 @org.junit.Test
    public void test()
     UserService userService = new UserServiceImpl();

     // 加了这一行代码,用户实现set注入自己的需要具体对象,不需要修改源代码中的任意一行
     ((UserServiceImpl)userService).setUserDao(new UserDaoMySQLImpl());
     
     userService.getUser();
    

  在之前的业务中,用户的需求可能会影响到我们之前写的代码,我们需要根据用户的需求去修改原代码。如果程序的代码量非常大,修改一次的成本非常大。

使用set接口实现,已经发生了革命性的变化(控制反转)


四、控制反转


  • 之前程序是主动创建对象的,控制权在程序员手上,所以用户的每一个需求都会让我们改代码。

(程序员用过new来写死一个创建的对象)

  • 使用set接口,程序不在具有主动性了,而是变成了被动的接收对象。

(使用set接口,原有的程序不用改变,用户只需要在使用的时候set一个需要的对象即可)

  当用户的需求再次增加,我们只需要扩展一个类来实现之前的接口,写具体的业务代码,用户在使用的时候set注入扩展的类即可。使得程序扩展更加方便,大大降低了系统的耦合性,也使得程序员可以更加专注的写业务代码,不需要管理对象的创建了。

  以上就是IOC思想的原型,Spring的IOC底层使用了大量的set方法实现各种对象注入,来解决以上的问题。


五、IOC实质


控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种具体方式。

上面的例子就是说明了程序中获得依赖对象的方式反转了。之前面向对象编程中,对象的创建与对象之间的依赖关系完全的硬编码在程序中,对象的创建由程序员自己控制,控制反转后将对象的创建交给第三方容器来做。

早些年,各个对象之间都是耦合的,一层调一层,理想的是中间加一个中间件使得各个对象耦合降低,IOC就是降低各个对象耦合度的中间容器。


可以使用XML配置或者注解的方式来实现IOC

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

「框架」菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

...1  原博客地址:https://my.oschina.net/sunqinwen/blog/539397spring最核心的部分莫过于ioc和aop了,博主菜逼一枚,如果有哪里理解的不对或者代码上有瑕疵的地方欢迎大家指正,大家互相学习,还有就是这只是模仿一下spring思想,只... 查看详情

spring学习笔记--环境搭建和初步理解ioc

  Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hibernate等其他众多的框架.  下面介绍环境的搭建,首先下载好spring的完... 查看详情

spring框架思想

JAVASSMSpring目录SpringSpring框架中都用到了哪些设计模式?依赖注入与控制反转一、分享Iteye的开涛对Ioc的精彩讲解1.1、IoC是什么1.2、IoC能做什么1.3、IoC和DI二、分享Bromon的blog上对IoC与DI浅显易懂的讲解2.1、IoC(控制反转)2.2、DI(依赖... 查看详情

初识spring及打印机案例

Spring框架概述:Spring是最受欢迎的企业级Java应用程序开发框架,数以百万的来自世界各地的开发人员使用Spring框架来创建性能好、易于测试、可重用的代码。Spring是轻量级的框架,其基础版本只有2MB左右的大小。一:IOC(InversionofC... 查看详情

spring入门篇2---ioc设计思想

...以前我们都是自己创建对象,进行实例化,现在交给框架spring来进行控制,以实现高度的解耦。IOC是设计思想,是Spring的核心,我们必须要掌握,因此通过几个例子,来看看到底是如何实现的,这样就可以有更清晰的认知,所有... 查看详情

spring框架基础(03):核心思想ioc说明,案例演示

...服务的服务之间耦合度,是软件工程核心问题之一。因为Spring框架中核心思想就是IOC控制反转,用来实现对象之间的解耦。2、控制反转传统方式对象A如果想使用对象B的功能方法,在需要 查看详情

spring-学习笔记(代码片段)

官网Spring官网Spring组件Spring中的组件,大致上提供了如下功能:IOC概念Ioc(InversionofControl),中文叫做控制反转。这是一个概念,也是一种思想。控制反转,实际上就是指对一个对象的控制权的反转。Ioc介绍首先创建一个普通的... 查看详情

spring框架详解(了解ioc,aop)(代码片段)

文章目录一、spring入门1.理解IOC2.导入依赖3.核心配置文件4.spring容器创建对象之无参构造法5.spring容器创建对象之有参构造法二、spring配置1.别名2.bean的配置3.import三、依赖注入1.set方式注入2.拓展注入方式2.1p命名方式2.2c命名方式3... 查看详情

ioc(控制反转思想)原型理论推导

1.0时代:需要一个Dao层(接口+ImpL)、对应一个Service层(接口+ImpL)1、Dao层封装了数据库操作,Service层ImpL类通过 new 一个Dao的ImpL类  并赋值给 Dao接口,实现对Dao层的调用,从而达到Dao层对于客户透明的目的。... 查看详情

springmybatis一篇文章带你理解spring整合mybatis的实质(代码片段)

Spring其实就是一个容器,管理所有注册到其中的bean,并通过IOC机制注入依赖。MyBatis是一个持久层框架,这个框架的作用就是规范Java与数据库的交互。在MyBatis框架中,与数据库的交互通过如下步骤。读取配置文件... 查看详情

spring框架学习-spring和ioc概述

一:什么是Spring框架?  spring是一个分层的javase/EEfull-stack(一站式)轻量级的java开源框架。是为了解决企业开发的复杂性而创建的。框架的主要优势是分层架构,Spring的核心是控制反转(IOC)和面向切面(AOP)。 二.学习... 查看详情

spring核心思想之ioc总结

说到Spring的核心思想Ioc和aop不是Spring提出来的,在Spring之前就已经存在,只不过更偏向理论化,Spring在技术层次把两个思想做了非常好的实现(java)第一部分:什么是IOCIOCInversionofControl(控制反转/反转控制),注意它是?个技术思想... 查看详情

spring框架学习(代码片段)

1:spring框架   spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。2:架构概述 ... 查看详情

spring学习spring概述

    从本文開始,我们就要一起学习Spring框架,首先不得不说Spring框架是一个优秀的开源框架。当中採用IoC原理实现的基于JavaBeans的配置管理和AOP的思想都是非常值得学习与使用的。以下我们就进入正题。介绍Java平... 查看详情

spring源码解析之ioc容器(代码片段)

...在技术的道路上注定走不长远。最近,学习了一段时间的spring源码,现在整理出来,以便日后温故知新。  IOC容器是spring最核心的模块之一,是整个spring体系的基石,spring其他模块中,都需要用到IOC容器的功能。spring框架为我... 查看详情

手写ioc及aop(代码片段)

...管理)的权利反转:控制权交给外部环境了(spring框架、IoC容器)传统开发⽅式:⽐如类A依赖于类B,往往会在类A中new⼀个B的对象IoC思想下开发方式:我们不⽤⾃⼰去new对象了,⽽是由IoC容器(... 查看详情

spring学习1:初识控制反转(ioc)——hello,spring(代码片段)

控制反转(IOC)是Spring框架的核心内容,本篇内容将利用Spring的IOC,来输出Hello,Spring。为什么需要用IOC据说,IOC能够极大地方便开发。在使用IOC之前,先看看如何用传统的实现类的方式,输出Hello,Spring。传统方式... 查看详情

最全面解析spring框架ioc容器和aop面向切面(代码片段)

一、Spring开源框架的简介Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由RodJohnson在其著作ExpertOne-On-OneJ2EEDevelopmentandDesign中阐述的部分理念和原型衍生而来。【参考文献】它是为了解决企业应用... 查看详情