Spring学习|Spring简介、IOC控制反转理解、IOC创建对象方式
Spring
Spring:春天------>给软件行业带来了春天!
2002,首次推出了Spring框架的雏形: interface21框架!
Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日发布了1.0正式版。
RodJohnson,Spring Framework创始人,著名作者。很难想象RodJohnson的学历,真的让好多人大吃惊,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。
spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!
优点
Spring是一个开源的免费的框架(容器)!
Spring是一个轻量级的、非入侵式的框架!
控制反转 (IOC),面向切面编程 (AOP) !
支持事务的处理,对框架整合的支持!
总结一句话: Spring就是一个轻量级的控制反转 (IOC)和面向切面编程 (AOP)的框架!
运用Spring首先需要导入依赖,spring-webmvc,为了后面整合Mybatis,需要导入spring-jdbc依赖

理解IOC原型的小demo
创建一个空的maven父工程,删除src目录,导入spring-webmvc依赖

编写一个DAO层接口,并定义一个获得用户的方法

编写一个接口实现类,实现接口,并重写方法,定义该方法的具体实现内容

编写一个Service层接口,并定义获得用户的方法

编写该Service接口的实现类,重写该方法,该方法实际操作就是导入刚才的DAO层实现类,并用该类执行对应的方法

客户端这边直接创建一个刚才编写的Service层的实现类,并调用该实现类的相应方法即可,该方法实际上就是执行了,自己导入的对应的DAO层实现类所执行的方法

如果说,我们需求增加,又新创建了一个DAO层接口的实现类,执行的内容不一样

那我们客户端如果想执行这个方法的话,那么就需要在Service实现类中,去将创建的DAO层实现类给更改为这个新的实现类(需要更改源代码)

然后客户端这边新建Service层的实现类后,调方法,执行的才会是新的DAO层实现类所执行的操作

上面的操作需要更改源代码,如果程序复杂的话,那我们需要更改很多源代码,非常不舒服,我们在Service层的实现类中,由之前主动创建一个对应的DAO层接口实现类,改为设一个set方法来让用户在客户端直接动态的注入所想执行的DAO层接口实现类,执行自己需要的方法。

比如,在客户端这边,用户想要执行MysqlImpl这个DAO层接口实现类所执行的方法,那么直接在新建一个Service层实现类后,通过我们之前的set方法,动态注入我们所需要的DAO层接口实现类即可。

用户想执行别的DAO层实现类所执行的操作,直接在set中更改对应的接口实现类即可,这种方式可以让我们不必更改后面的源代码,只专注于业务即可。

小结
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!
我们使用一个Set接口实现.已经发生了革命性的变化!
之前,程序是主动创建对象!控制权在程序猿手上!
使用了set注入后,程序不再具有主动性,而是变成了被动的接受对象!
这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。系统的耦合性大大降低~,可以更加专注的在业务的实现上!这是IOC的原型!

IOC本质
控制反转loC(lnversion of Control),是一种设计思想,DI(依赖注入)是实现loC的一种方法,也有人认为DI只是loC的另一种说法。没有loC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是loC容器,其实现方法是依赖注入 (DependencyInjection,DI)。
理解IOC的demo,HelloSpring
编写一个实体类Hello,并设置一个str属性,设置对应的get/set方法

IOC需要在resources目录下创建一个xml的配置文件,用来创建、管理bean(实体类),名字可以随意,不过正规是applicationContext.xml

我们将刚才自己写的Hello实体类,设置在其中,id代表实体类对象的名字,class代表对应的实体类,property和value,可以根据实体类中的set方法,设置生成对象的属性值,这里就相当于spring容器帮我们创建了一个属性str值为Spring的hello对象。

编写测试类,先获得context对象,然后根据id对象名用getBean方法,获得由spring容器创建好的hello对象

思考问题
Hello 对象是谁创建的 ?
hello 对象是由Spring创建的
Hello 对象的属性是怎么设置的 ?
hello 对象的属性是由Spring容器设置的
这个过程就叫控制反转:
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的.
反转:程序本身不创建对象,而变成被动的接收对象
依赖注入:就是利用set方法来进行注入的
IOC是一种编程思想,由主动的编程变成被动的接收
OK,到了现在,我们彻底不用在程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的loC,一句话搞定 : 对象由Spring 来创建,管理,装配!
我们把Hello类中的set方法删除

我们可以看到bean.xml中的str爆红,因为没有set方法供其来赋值,注入值

我们将第一demo,中不同的DAO层接口实现类在bean.xml中配置,并且将Service层的接口实现类配置,并且,将其属性userDao,用ref赋值为用户需要的DAO层接口实现类

之前在客户端,还需要手动创建Service层接口实现类,并且通过set方法来穿我们需要的DAO层接口实现类,让Service层接口实现类执行相应的DAO层接口实现类的方法。

如今,我们只需要获得context上下文对象,然后用getBean方法,根据id名获取Service层接口实现类,其具体的要实现哪个DAO层的接口实现类,在bean.xml中已经配好,直接执行就行了,刚赋值的是mysqlImpl,故执行的是这个DAO层接口实现类的方法

想要更换别的DAO层接口实现类的方法,那只需在bean.xml中,在创建Service层接口实现类对象时,将其属性userDao用ref赋值为我们需要的DAO层接口实现类即可。

客户端代码不变,再次执行,就可执行更改后的DAO层接口实现类所执行的方法,可以看到用户不需要再去更改程序的代码,只需要在bean.xml中修改相应的配置即可。

IOC创建对象方式
我们定义一个实体类,有一个无参构造器

在bean.xml中配置这个实体类

在客户端获得context对象,然后getBean方法得到这个user对象,可以发现spring容器走的是无参构造器创建的这个对象

有参构造器创建
给该实体类只设置一个有参构造器

第一种下标赋值
在bean.xml中配置该实体类,参数根据参数的下标来对应赋值

第二种,根据参数类型赋值(不建议)

第三种,直接根据参数名赋值

我们再创建一个额外的实体类,并设置无参构造器

将其在bean.xml种配置

我们在客户端再获得context对象,然后getBean获得第一个实体类的对象,我们发现我们新设置的这个实体类对象也依然通过其自己的无参构造器被创建了

总结:
故我们可以知道,我们配置的实体类在配置文件加载的时候,容器中管理的对象就已经初始化了!
相关文章:
Spring学习|Spring简介、IOC控制反转理解、IOC创建对象方式
Spring Spring:春天------>给软件行业带来了春天! 2002,首次推出了Spring框架的雏形: interface21框架! Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日发布了1.0正式版。 RodJohnson,Spring Framework创始人&…...
DDR2 IP核调式记录2
本文相对简单,只供自己看看就行。从其它的博客找了个代码,然后记录下仿真波形。 1. 功能 直接使用quartus生成的DDR2 IP核,然后实现循环 -->写入burst长度的数据后读出。 代码数据的传输是32位,实际使用了两片IC。因此IP核也是…...
【ES6】js 中class的extends、super关键字用法和避坑点
在JavaScript中,使用class关键字可以实现面向对象编程。其中,extends和super是两个非常重要的关键字,它们分别用于实现类的继承和调用父类的方法。 一、extends关键字 extends关键字用于实现类的继承,它可以让一个子类继承父类的…...
mysql排名函数row_number()over(order by)和with * as 的用法
601. 体育馆的人流量(力扣mysql题,难度:困难) 表:Stadium ------------------------ | Column Name | Type | ------------------------ | id | int | | visit_date | date | | people | int | ------------------------vis…...
linux局域网IP地址冲突检测
使用keepalived设置vip的时候,发现vip无法连接,经查是出现了ip地址冲突,使用了一个在用的ip作为了vip,但是这个ip其实ping不通,因为目标机禁用了ping,也即是丢弃了ICMP包。 一、那么怎么检测IP地址是否已经…...
远距离WiFi模组方案,实现移动设备之间高效通信,无人机远程图传应用
随着科技的不断进步,无线通信技术也在日新月异地发展。其中,WiFi技术已经成为现代生活中不可或缺的一部分。 从室内到室外,WiFi的应用场景正在不断扩大,为我们的日常生活和工业生产带来了极大的便利。 WiFi技术,即无…...
Docker构建Springboot项目,并发布测试
把SpringBoot项目打包成Docker镜像有两种方案: 全自动化:先打好docker镜像仓库,然后在项目的maven配置中配置好仓库的地址,在项目里配置好Dockerfile文件,这样可以直接在idea中打包好后自动上传到镜像仓库,…...
flutter架构全面解析
Flutter 是一个跨平台的 UI 工具集,它的设计初衷,就是允许在各种操作系统上复用同样的代码,例如 iOS 和 Android,同时让应用程序可以直接与底层平台服务进行交互。如此设计是为了让开发者能够在不同的平台上,都能交付拥…...
QHttpServer
QLineEdit-----输入提示 改动CmakeLists.txt 在帮助–索引查找QHttpServer 改动CmakeLists.txt,有三处改动 在谷歌浏览器测试,输入127.0.0.1/api/login 测试代码 #include<QCoreApplication> #include <QHttpServer> //http服务器 int m…...
21.3 CSS 背景属性
1. 背景颜色 background-color属性: 设置元素的背景颜色. 它可以接受各种颜色值, 包括命名颜色, 十六进制颜色码, RGB值, HSL值等.快捷键: bctab background-color:#fff;<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…...
Ansible 常用命令50条
以下是 Ansible 常用的 50 条命令: ansible --version: 查看 Ansible 版本信息。ansible all -m ping: 检查所有主机的连通性。ansible-playbook playbook.yml: 运行指定的 Ansible Playbook 文件。ansible-doc module_name: 查看指定模块的帮助文档。ansible-conf…...
ceph源码阅读 erasure-code
1、ceph纠删码 纠删码(Erasure Code)是比较流行的数据冗余的存储方法,将原始数据分成k个数据块(data chunk),通过k个数据块计算出m个校验块(coding chunk)。把nkm个数据块保存在不同的节点,通过n中的任意k个块还原出原始数据。EC包含编码和解…...
C++ 之 命名空间
namespace_百度百科,有示例...
MyBatis关系映射
文章目录 前言一、一对一映射1.1 创建实体1.2 xml配置 二、一对多映射2.1 创建实体2.2 resultMap配置2.3 测试 三、 多对多映射3.1 创建实体3.2 resultMap配置3.3 测试 前言 MyBatis是一个Java持久化框架,它提供了一种将数据库表和Java对象之间进行关系映射的方式。…...
DVWA失效的访问控制
失效的访问控制,可以认为是系统对一些功能进行了访问或权限限制,但因为种种原因,限制并没有生效,造成失效的访问控制漏洞,比如越权等 这里以DVWA为例,先访问低难度的命令执行并抓包 删除cookie,并在请求头…...
docker 笔记2 Docker镜像和数据卷
参考: 1.镜像是什么?(面试题) 是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文…...
java springboot 时间格式序列化 UTC8
背景 我们在项目中使用序列化和反序列化组件中,默认一般采用Jackson,如果遇到特殊配置,我们该怎么配置呢,大致有如下两种方式:采用配置文件【application.yml】和代码配置 配置文件 比如添加jackson节点 spring:jac…...
攻防世界-Get-the-key.txt
原题 解题思路 notepad看到,这应该是一个压缩包,解压。 但是解压的时候提示格式不对,不是zip,rar可以。解压出来有一个key.txt,打开就行。...
MyBatisPlus之DQL编程控制
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 MyBatisPlus之DQL编程控制 一、 条件查询方式&…...
本地使用GFPGAN进行图像人脸修复
人脸修复 1.下载项目和权重文件2.部署环境3.下载权重文件4.运行代码5.网页端体验 首先来看一下效果图 1.下载项目和权重文件 https://github.com/iptop/GFPGAN-for-Video.git2.部署环境 根据README文件部署好环境,额外还需要: cd GFPGAN-1.3.8 pyt…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
