01Spring的Ioc思想和依赖注入手段(DI)

news2025/1/15 16:53:40

传统方式创建对象的缺陷

连接MySQL实现登录功能

控制层UserController

public class UserController {
    //多态,半面向接口编程
    private UserService userService = new UserServiceImpl();
    public void login(){
        String username = "admin";
        String password = "123456";
        boolean success = userService.login(username, password);
        if (success) {
            // 登录成功
        } else {
            // 登录失败
        }
    }
}

业务层的UserService接口及其实现类UserServiceImpl

public interface UserService {
    boolean login(String username, String password);
}

public class UserServiceImpl implements UserService {
	//多态,面向接口编程
    private UserDao userDao = new UserDaoImplForMySQL();
    public boolean login(String username, String password) {
        User user = userDao.selectByUsernameAndPassword(username, password);
        if (user != null) {
            return true;
        }
        return false;
    }
}

数据访问层的UserDao接口及其实现类UserDaoImplForMySQL

public interface UserDao {
    User selectByUsernameAndPassword(String username, String password);
}

public class UserDaoImplForMySQL implements UserDao {
    public User selectByUsernameAndPassword(String username, String password) {
        // 连接MySQL数据库,根据用户名和密码查询用户信息
        return null;
    }
}

功能扩展连接Oracle实现登录

若更换到Oracle数据库上则需要再提供一个UserDaoImplForOracle, 这样就引起了连锁反应,UserServiceImpl类代码需要修改违背了OCP开闭原则

public class UserDaoImplForOracle implements UserDao {
    public User selectByUsernameAndPassword(String username, String password) {
        // 连接Oracle数据库,根据用户名和密码查询用户信息
        return null;
    }
}

public class UserServiceImpl implements UserService {
    // 在进行功能扩展的时候修改了源代码, 违背了OCP开闭原则
    // private UserDao userDao = new UserDaoImplForMySQL();
    private UserDao userDao = new UserDaoImplForOracle();

    public boolean login(String username, String password) {
        User user = userDao.selectByUsernameAndPassword(username, password);
        if (user != null) {
            return true;
        }
        return false;
    }
}

软件七大开发原则(为解耦合服务)

OCP开闭原则

对外扩展开放修改关闭: 软件开发过程中若在进行功能扩展的时候添加额外的类是没问题的,但因为功能扩展而修改之前运行正常的程序这是不被允许的

  • 因为一旦修改之前运行正常的程序,就会导致项目整体要进行全方位的重新测试(这是相当麻烦的过程)

传统方式的MVC架构,上层是依赖下层的代码之间的耦合度太高, 这样会导致只要下面改动上面必然也需要改,所谓牵一发而动全身
在这里插入图片描述

依赖倒置原则DIP

依赖倒置原则(Dependence Inversion Principle): 就是倡导面向抽象编程,完全面向接口编程,不要面向具体编程

  • 上层不再依赖下层,即下面改动了上面的代码不会受到牵连 , 这样可以大大降低程序的耦合度,耦合度低了扩展力就强了,同时代码复用性也会增强

半面向接口编程: 对象的创建和属性的赋值都是手动, 使用到了具体的接口实现类

public class UserServiceImpl implements UserService {
    //private UserDao userDao = new UserDaoImplForMySQL();
    private UserDao userDao = new UserDaoImplForOracle();
    public boolean login(String username, String password) {
        User user = userDao.selectByUsernameAndPassword(username, password);
        if (user != null) {
            return true;
        }
        return false;
    }
}

完全面向接口编程:对象的创建是自动的, 属性也是自动赋值的, 但是在执行的时候需要解决空指针异常的问题

  • 第一个问题:谁来负责对象的创建【new UserDaoImplForOracle() 或者 new UserDaoImplForMySQL()】
  • 第二个问题:谁来负责把创建的对象赋到这个属性上【把上面创建的对象赋给userDao属性】
public class UserServiceImpl implements UserService {
    //private UserDao userDao = new UserDaoImplForMySQL();
    //private UserDao userDao = new UserDaoIm   plForOracle();
    private UserDao userDao;
    public boolean login(String username, String password) {
        User user = userDao.selectByUsernameAndPassword(username, password);
        if (user != null) {
            return true;
        }
        return false;
    }
} 

控制反转IoC思想

控制反转(Inversion of Control)是面向对象编程中的一种设计思想或一种新型的设计模式(由于理论和时间成熟相对较晚,没有被纳入GoF23种设计模式范围内)

  • 当程序既违背OCP又违背DIP时, 可以采用“控制反转”这种编程思想来解决问题 , 可以用来降低代码之间的耦合度
  • 控制是控制资源的获取方式是主动还是被动 , 反转是将对象的创建权交出去,将对象和对象之间关系的维护权交出去,由第三方容器来负责创建与维护

依赖注入手段(DI)

依赖注入是实现控制反转这种思想的一种常用实现手段 , 底层使用的是反射机制给属性赋值

  • 依赖(Dependency):对象和对象之间的关联关系, 如A类中有一个B类型的属性就说明A依赖了B
  • 注入(Injection):一种数据传递行为,如给A对象的B类型的属性赋值 ,让A类型的对象和B类型的对象产生了关系(靠注入的手段来维护A和B之间的关系)
  • Spring通过依赖注入的方式来完成Bean管理(实现Bean对象的创建以及Bean对象中属性的赋值或者叫做Bean对象之间关系的维护)

依赖注入常见的实现方式包括两种

  • set注入(执行set方法给属性赋值)
  • 构造方法注入(执行构造方法给属性赋值)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1016573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 Zookeeper 实现分布式锁

文章目录 前言声明前置知识分布式锁设计原则Zookeeper 分布式锁实现Curator框架实现分布式锁总结 前言 在分布式系统中,确保数据的一致性和避免冲突是一个核心问题,通常我们通过分布式锁来解决,分布式锁本质是一种同步机制,用于控…

【AI】机器学习——支持向量机(线性模型)

支持向量机是一种二分类算法,通过在高维空间中构建超平面实现对样本的分类 文章目录 5.1 SVM概述5.1.1 分类 5.2 线性可分SVM5.2.1 线性可分SVM基本思想5.2.2 策略函数间隔几何间隔硬间隔最大化 5.2.3 原始算法支持向量 5.2.4 对偶形式算法1. 构造并求解对偶问题2. …

【小沐学CAD】嵌入式UI开发工具:GL Studio

文章目录 1、简介2、软件功能3、应用行业3.1 航空3.2 汽车3.3 防御3.4 工业3.5 电力与能源3.6 医疗3.7 空间3.8 科技 结语 1、简介 https://disti.com/gl-studio/ DiSTI 是 HMI 软件、虚拟驾驶舱、仪表、信息娱乐、集群显示器和嵌入式 UI 解决方案的领先提供商。 而它的GL Stu…

kubernetes部署(kubeadmin)

文章目录 1.环境准备2. 安装dokcer3.部署cri-docker4.各个节点安装kubeadm等5.整合kubelet和cri-dockerd配置cri-dockerd配置kubelet 6.初始化集群 1.环境准备 环境和软件版本 OS : ubuntu 20.04 container runtime: docker CE 20.10.22 kubernetes 1.24.17 CRI:cr…

atoi函数

介绍&#xff1a; 头文件: <stdlib.h> 此函数的功能是将数字字符的字符串转化为字面上的整型返回。 例如&#xff1a; char arr1[] "-12"; char arr2[] "12"; char arr3[] " -12"; char arr4[] "-12a";使用atoi 我们…

Postman的高级用法一:重新认识postman核心模块

本请求示例来自于免费天气API&#xff1a; 实况天气接口API开发指南 未来一天天气预报api - 天气API 关于Postman的核心模块 全局变量请求接口请求体预处理脚本 类似beforeTest&#xff0c;在发起请求前的预执行逻辑&#xff0c;通常是生成一些动态变量值 测试用例模块 测试者…

RK3399平台开发系列讲解(入门篇)VIM的基础命令

🚀返回专栏总目录 文章目录 一、Vim 命令速查二、其他命令三、Vim模式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍Vim相关命令。 一、Vim 命令速查 简单说明一下,这张图上展示了一个键盘。图中的“•”表示,单个字母不是完整的命令,必须再有进一步…

MFC使用MScomm32.ocx控件实现串口通信

文章目录 建立项目添加MSCOMM控件变量串口的打开和关闭串口发送和接收数据数据接收数据发送16进制数据的收发转换函数数据发送数据接收项目下载地址首先电脑应该有MSCOMM32.OCX并注册 建立项目 使用VS2005新建一个基于对话框的MFC项,在资源视图,右键窗体,插入ActiveX控件,…

基于Questasim的SystemVerilog DPI使用流程

1. 前言 DPI是Direct Programming Interface的缩写&#xff0c;它提供了SystemVerilog与其它编程语言(特别是C语言)交互的接口。它允许编程人员轻松地从SystemVerilog调用C函数&#xff0c;且在C函数也可以调用Systemverilog的函数。 DPI极大地方便了使用现有的C代码&#xf…

SpaceX预计到2022年Starlink用户将达到2000万,但最终达到了100万

SpaceX的Starlink部门还没有接近实现客户和收入的预测&#xff0c;该公司在建立卫星网络之前与投资者分享了这一点华尔街日报报道今天出版。 据报道&#xff0c;2015年的一份题为“SpaceX用来从投资者那里筹集资金”的报告预计&#xff0c;到2022年&#xff0c;Starlink的订户…

Linux安装RocketMQ

又又又....Linux裝RocketMQ。 vim命令找不到 rootlocalhost ~]# sudo vim sudo: vim&#xff1a;找不到命令 [rootlocalhost ~]# sudo yum install vim 已加载插件&#xff1a;fastestmirrorFile contains no section headers. file: file:///etc/yum.repos.d/mysql-communit…

Linux网络配置:最佳指南

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

CSS核心使用

CSS核心使用 box-sizingbox-shdowtext-shadowpositionwriting-mode box-sizing 定义计算一个元素的总高度和总宽度. 属性值 content-box 默认值,width 内容宽度,height内容的高度border-box 宽度和高度包含内容,内边距和边框 widthborderpadding内容宽度, heightborderpaddi…

嵌入式:驱动开发 Day4

作业&#xff1a;通过字符设备驱动分步注册方式编写LED驱动&#xff0c;完成设备文件和设备的绑定 驱动程序&#xff1a;myled.c #include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #include <linux/fs.h> #include <l…

软件设计模式系列之七——原型模式

1 模式的定义 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是通过复制现有对象来创建新对象&#xff0c;而不是使用构造函数。原型模式将对象的创建委托给原型对象&#xff0c;通过克隆&#xff08;复制&#xff09;来生成新…

大数据Flink(八十二):SQL语法的DDL:Create 子句

文章目录 SQL语法的DDL:Create 子句 一、建表语句

蓝桥杯打卡Day10

文章目录 最长ZigZag子序列最小面积子矩阵 一、最长ZigZag子序列IO链接 本题思路&#xff1a;本题是一道dp问题&#xff0c; 集合划分:只有一个a[i]或者倒数第二个元素是第j个数字并且需要是下降得到a[j]:g[j]1,状态计算f[i]max(f[i],g[j]1),这是第一种情况&#xff0c;还有一…

许可分析 license分析 第十四章

许可分析是指对软件许可证进行详细的分析和评估&#xff0c;以了解组织内部对软件许可的需求和使用情况。通过许可分析&#xff0c;可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤&#xff1a; 软件许可证的软件定义&#xff1a;采用软件定…

Kotlin File FileTreeWalk walkTopDown onEnter onLeave

Kotlin File FileTreeWalk walkTopDown onEnter onLeave Python遍历文件目录os.walk_for subfolder in subfolders: print(foldername/_zhangphil的博客-CSDN博客import osfor folderName, subfolders, filenames in os.walk(rD:\code\vs_code): print(当前文件夹: folderName…

【Java 基础篇】深入理解Java递归:从小白到专家

在编程世界中&#xff0c;递归是一个经常被提及的概念。但对于初学者来说&#xff0c;它可能会感到有点神秘和复杂。本文将深入探讨Java中的递归&#xff0c;从基础概念开始&#xff0c;逐步深入&#xff0c;帮助你理解这个强大的编程工具。 什么是递归&#xff1f; 递归是一…