当前位置: 首页 > news >正文

Spring 知识点

Spring

1.1 Spring 简介

1.1.1 Spring 概念

  • Spring是一个轻量级Java开发框架,最早有Rod Johnson创建
  • 为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题
  • Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发
  • 使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!

spring 官网链接:Spring

spring 官网源码下载链接:Spring Framework

GitHub 下载地址:Spring源码 GitHub 下载地址

1.1.2 Spring 优点

  • Spring是一个开源的免费的框架(容器)
  • Spring是一个轻量级的、非入侵式的框架
  • 控制反转(IOC),面向切面编程(AOP)
  • 支持事务的处理,对框架整合的支持!
  • 总的来说:Spring就是一个轻量级的控制反转(IOC)和面向切面编程的框架!

1.1.3 Spring 使用的 jar 包

  • 使用 Spring 之前,需要导入两个 jar 包
  • 将以下代码粘入 maven 即可
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version>
</dependency>
<!-- 这个包用于之后与 mybatis 做整合 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.0.RELEASE</version>
</dependency>

1.2 IOC 理论推导

1.2.1 什么是 IOC 理论推导

  • IOC : 控制反转,将创建对象的权利交给用户
  • 是面向对象编程中的一种设计原则,是一种想法
  • 可以用来减低计算机代码之间的耦合度
  • 其中最常见的方式叫做依赖注入

1.2.2 IOC 理论推导 代码演示

  • 正常编写一个业务需要

    • UserDao接口

    • UserDaolmpl实现类

    • UserService 业务接口

    • UserServicelmpl 业务实现类

  • 例如下面所示

image-20230806123227131

  • 我们在 service 层调用 userdao 层的方法
package com.qiaoer.service;import com.qiaoer.dao.UserDao;
import com.qiaoer.dao.impl.UserDaoImplMySql;public class UserServiceImpl implements UserSerivce{private UserDao userDao=new UserDaoImplMySql();@Overridepublic void getAllUser() {userDao.getAllUser();}
}
  • 正常是这样调用的,但是这样同时存在着一个问题
  • 当我们相应 dao 层的 Oracle 实现类时,就需要修改 new 的实现类,例如这样
package com.qiaoer.service;import com.qiaoer.dao.UserDao;
import com.qiaoer.dao.impl.UserDaoImplMySql;
import com.qiaoer.dao.impl.UserDaoImplOracle;public class UserServiceImpl implements UserSerivce{private UserDao userDao=new UserDaoImplOracle();@Overridepublic void getAllUser() {userDao.getAllUser();}
}
  • 如果有好几种实现类,那用户每次需要修改时,都需要修改源代码
  • 这里就需要利用 set 动态实现值的注入
  • 具体代码如下
package com.qiaoer.service;import com.qiaoer.dao.UserDao;
import com.qiaoer.dao.impl.UserDaoImplMySql;
import com.qiaoer.dao.impl.UserDaoImplOracle;public class UserServiceImpl implements UserSerivce{private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void getAllUser() {userDao.getAllUser();}
}
  • 刚刚是程序控制创建和调用对象
  • 增加了 set 方法后,则是用户去选择实现,直接调用即可

1.2.3 IOC 理论推导总结

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

1.3 IOC 容器

1.3.1 IOC 容器简介

  • IOC (Inversion of Control,控制反转) 容器是一种用于管理和组织应用程序中组件(或对象)的框架
  • 它是一种软件设计模式,旨在实现应用程序的松耦合,提高可维护性和可测试性
  • IOC 容器通过控制对象的创建、依赖解析和生命周期管理,将对象的控制权从应用程序代码转移到容器中。
  • IOC 容器是一个重要的软件设计工具,可以帮助开发者实现可维护、可扩展和可测试的应用程序

1.3.2 使用 Spring 创建对象

  • 使用 Spring 之前,优先导入 Spring 的 jar 包
  • 将以下代码复制进 maven 即可
  <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.9</version></dependency>
  • 在资源文件夹 resources 下创建一个名为 applicationContext.xml 的文件

image-20230806203906900

  • 在 spring 官网找到 ioc容器的元数据

  • **在官网的 ico容器概述内可以找到 网站:Container Overview :: Spring Framework **

  • 网址: https://docs.spring.io/spring-framework/reference/core/beans/basics.html

  • 进入官网下滑找到 <beans> 标签的内容复制

image-20230806203954287

  • 或者直接复制我下方的代码
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="..." class="..."><!-- collaborators and configuration for this bean go here --></bean><bean id="..." class="..."><!-- collaborators and configuration for this bean go here --></bean><!-- more bean definitions go here --></beans>
  • 直接将这段代码放入刚刚创建的 applicationContext.xml 文件当中

image-20230806204130891

  • 这里的 <bean></bean> 标签实际上就类似于 new 了一个对象
  • <bean> 标签的 属性 id 代表对象的对象吗
  • <bean> 标签的属性 class 则代表引用的哪个类,要加上包名
  • Spring 使用示例 (applicationContext.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.qiaoer.entity.Hello"></bean>
</beans>

image-20230806204457633

  • 使用 ClassPathXmlApplicationContext 对象可以获取 Spring 的上下文
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  • 括号内的构造函数参数为 applicationContext.xml 即 Spring 配置文件的路径
  • 使用 getBean(String id) 方法可以获取具体的对象,括号内的参数对应 xml 文件当中为 <bean> 标签的 id 属性
  • 示例,获取 Hello 类的对象
import com.qiaoer.entity.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");Hello hello = (Hello)classPathXmlApplicationContext.getBean("hello");System.out.println(hello);}
}

1.3.3 使用 Spring 为对象当中的属性赋值

  • 使用 <bean> 标签内的 子标签 <property> 来赋值
  • <property> 标签语法
 <property name="属性名" value="具体值"/>
  • <property> 标签的 name 属性为对象中要赋值的属性名,value 属性是为属性赋的值
  • 使用 <property> 赋值必须在类中为属性写有对应的 get 和 set 方法来赋值和取值
  • 示例
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.qiaoer.entity.Hello"><property name="name" value="你好"/></bean>
</beans>
import com.qiaoer.entity.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");Hello hello = (Hello)classPathXmlApplicationContext.getBean("hello");System.out.println(hello.getName());}
}
  • 如果我们要给属性赋的值是一个对象的引用的话 应使用 <property> 标签的 ref 属性 而不是 value 属性
  • 示例,现在新建一个 HelloSpring 的类,该为为 Hello 类的属性

image-20230806210254128

  • 在 applicationContext.xml 当中,应事先创建好 HelloSpring 的对象,然后使用 ref 属性指向该对象的应用
  • 示例
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    创建 HelloSpring 对象--><bean id="helloSpring" class="com.qiaoer.entity.HelloSpring"/><bean id="hello" class="com.qiaoer.entity.Hello">
<!--        将该属性的引用指向 HelloSpring 对象--><property name="helloSpring" ref="helloSpring"/></bean>
</beans>
  • ref 属性的值为要执行对象的 id 的值
  • 这样就将 HelloSpring 对象赋给了 Hello 内的 HelloSpring 类型的属性

1.3.4 IOC 创建对象方式

  • spring 默认创建对象时会调用类的无参构造
  • 也可以通过自己给构造器赋值,来调用有参构造,主要有 3 种方式
  • 需要使用 <bean> 标签中的子标签 <constructor-arg> 来给构造器赋值
  • 实体类 Hello 示例
package com.qiaoer.entity;public class Hello {private String name;private int age;public Hello(String name, int age) {this.name = name;this.age = age;System.out.println("name:"+this.name);System.out.println("age:"+this.age);}public Hello(String name) {this.name = name;System.out.println("name:"+this.name);}public Hello() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
  • 1、使用下标创建

    • 示例
    <?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.qiaoer.entity.Hello"><constructor-arg index="0" value="巧克力"/><constructor-arg index="1" value="17"/></bean>
    </beans>
    
    • 下标 0 表示构造器第一个参数 String name ,以此类推
    • 通过下标赋值不用注意顺序
    • 在创建此对象时则会直接调用有两个参数的有参构造
    import com.qiaoer.entity.Hello;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");Hello hello = (Hello)classPathXmlApplicationContext.getBean("hello");}
    }
    
  • 2、使用类型创建

    • 示例
    <?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.qiaoer.entity.Hello"><constructor-arg type="int" value="17"/><constructor-arg type="java.lang.String" value="巧克力"/></bean>
    </beans>
    
    • 通过类型赋值时,当用相同类型的参数时,需要按照参数的顺序来赋值
    • 类型赋值不建议使用,因为当有相同类型时,容易混淆
    • 基本类型的可以直接写
    • 引用类型需要加上包名
  • 3、参数名创建

    • 示例
    <?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.qiaoer.entity.Hello"><constructor-arg name="age" value="17"/><constructor-arg name="name" value="巧克力"/></bean>
    </beans>
    
    • 使用参数名创建也不需要注意顺序
    • 直接使用参数的名字便可赋值,推荐使用

a/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”>





- 使用参数名创建也不需要注意顺序
- 直接使用参数的名字便可赋值,推荐使用

相关文章:

Spring 知识点

Spring 1.1 Spring 简介 1.1.1 Spring 概念 Spring是一个轻量级Java开发框架&#xff0c;最早有Rod Johnson创建为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题Spring最根本的使命是解决企业级应用开发的复杂性&#xff0c;即简化Java开发。使现有的技术更加容易使…...

目标跟踪与检测后进行 OpenCV 人脸识别 ,马赛克

文章大纲 简介模型下载地址ONNX 静态与动态 参数OpenCV 中支持的 人脸检测、识别Face detection 人脸检测YuNetFace recognition 人脸识别sFace目标检测,跟踪 后的人脸模糊问题汇总不支持动态输入的问题参考文献与学习路径简介 OpenCV 4.5.4版本收录了一个基于深度学习神经网…...

持有PMP证书,可申请CSPM证书!

一&#xff0c;CSPM介绍 CSPM的全称是&#xff1a;项目管理专业人员能力评价&#xff0c;是我们国内的“PMP”&#xff0c;是我们中国人自己的项目管理专业人士评价指南&#xff0c;符合中国国情且符合中国未来发展的项目管理专业人员能力评价标准。 2022年10月12日发布实施了…...

linux自定义网络访问规则

1.更改防火墙默认区域为trusted firewall-cmd --set-default-zonetrusted 2.新建一个zone&#xff0c;将想要访问本机80端口的ip&#xff0c;如&#xff1a;192.168.3.99 &#xff0c;添加的这个zone中&#xff0c;同时在这个zone中放行80端口。 firewall-cmd --permanent --ne…...

247 个经典实用有趣的 Python 实例附源码

今天给大家整理了 247 个经典实用有趣的 Python 实例&#xff0c;185 页代码齐全可复制 pdf&#xff0c;几乎涵盖了 Python 各个方面的知识点&#xff0c;即可以帮助小白快速全面的学习 Python&#xff0c;也可以让老手通过实战练习来查缺补漏。 福利&#xff1a;文末有chat-g…...

动手学深度学习Pytorch 4.4练习

1.这个多项式回归问题可以准确地解出吗&#xff1f;提⽰&#xff1a;使⽤线性代数。 可以,把多项式问题&#xff0c;用matlab的str2sym表示出来&#xff0c;再用solve求解。 2.考虑多项式的模型选择。 1. 绘制训练损失与模型复杂度&#xff08;多项式的阶数&#xff09;的关系…...

【计算机视觉 | Kaggle】飞机凝结轨迹识别 Baseline 分享和解读(含源代码)

文章目录 一、导读二、比赛背景三、比赛任务四、比赛数据五、评价指标六、Baseline6.1 Training part6.2 Submission part 一、导读 比赛名称&#xff1a;Google Research - Identify Contrails to Reduce Global Warming https://www.kaggle.com/competitions/google-researc…...

ThinkPHP文件上传:简便安全的解决方案

在现代Web应用程序中&#xff0c;文件上传是一项常见而重要的功能。ThinkPHP是一种流行的PHP开发框架&#xff0c;提供了便捷而安全的文件上传解决方案。本文将介绍ThinkPHP框架中的文件上传功能&#xff0c;并探讨如何使用它来实现安全可靠的文件上传功能。 一、ThinkPHP文件…...

torch.multiprocessing

文章目录 张量共享torch.multiprocessing.spawnmultiprocessing.Pool与torch.multiprocessing.Pool阻塞非阻塞map阻塞非阻塞 starmap torch.multiprocessing是具有额外功能的multiprocessing&#xff0c;其 API 与multiprocessing完全兼容&#xff0c;因此我们可以将其用作直接…...

解决本地代码commit后发现远程分支被更新的烦恼!

解决本地代码commit后远程分支更新的烦恼&#xff01; 在进行代码开发过程中&#xff0c;当我们准备将本地代码推送到远程分支时&#xff0c;有时会遇到远程分支已经被更新的情况。这给我们的开发工作带来了一些挑战&#xff0c;因为我们需要确保我们的修改与远程分支的更新保持…...

最新AI创作系统ChatGPT程序源码+详细搭建部署教程+微信公众号版+H5源码/支持GPT4.0+GPT联网提问/支持ai绘画+MJ以图生图+思维导图生成!

使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到系统&#xff01; 新增 MJ 官方图片重新生成指令功能同步官方 Vary 指令 单张图片对比加强 Vary(Strong) | Vary(Subtle)同步官方 Zoom 指令 单张图片无限缩放 Zoom out 2x | Zoom out 1.5x新增GPT联网提问功能、手机号注…...

910数据结构(2014年真题)

算法设计题 问题1 已知一个带头结点的单链表head&#xff0c;假设结点中的元素为整数&#xff0c;试编写算法&#xff1a;按递增次序输出单链表中各个结点的数据元素&#xff0c;并释放结点所占的存储空间。要求&#xff1a;(1)用文字给出你的算法思想&#xff1b;(2)不允许使…...

Idea创建maven管理的web项目

如果你想在项目中添加一个传统的 src 目录来存放源代码&#xff0c;可以按照以下步骤操作&#xff1a; 1. 在项目视图中&#xff0c;右键单击项目名称&#xff0c;选择 “New” -> “Directory”。 2. 在弹出的对话框中&#xff0c;输入目录名称为 “src”&#xff0c;然后…...

Java并发编程(一)多线程基础概念

概述 多线程技术&#xff1a;基于软件或者硬件实现多个线程并发执行的技术 线程可以理解为轻量级进程&#xff0c;切换开销远远小于进程 在多核CPU的计算机下&#xff0c;使用多线程可以更好的利用计算机资源从而提高计算机利用率和效率来应对现如今的高并发网络环境 并发编程…...

D. Strong Vertices - 思维 + 二分

分析&#xff1a; 首先找到边的指向很容易&#xff0c;但是暴力是o(n2&#xff09;&#xff0c;超时&#xff0c;可以将给定的式子变形&#xff0c;au - av > bu - bv即au - bu > av - bv&#xff0c;可以将两个数组转变为一个数组中的任意两个值之间的关系&#xff0c;因…...

8月9日上课内容 nginx负载均衡

负载均衡工作当中用的很多的&#xff0c;也是面试会问的很重要的一个点 负载均衡&#xff1a;通过反向代理来实现&#xff08;nginx只有反向代理才能做负载均衡&#xff09; 正向代理的配置方法&#xff08;用的较少&#xff09; 反向代理的方式&#xff1a;四层代理与七层代…...

为何我们都应关心算法备案?

随着技术的日新月异&#xff0c;算法成为现代生活的核心组成部分&#xff0c;从社交媒体推荐、在线广告到智能交通管理&#xff0c;几乎无处不在。然而&#xff0c;如此普及的技术给我们带来了一个新的挑战&#xff1a;如何确保算法的透明度、公正性和道德性&#xff1f;答案可…...

[IDEA]使用idea比较两个jar包的差异

除了一些小工具外&#xff0c;idea自带了jar包比较的功能。 把需要比对的jar包放到任意目录下&#xff0c;然后选中两个需要比较的jar包&#xff0c;右键&#xff0c;选择Compare Archives&#xff0c;然后就可以比较了。 这次疏忽了&#xff0c;每次打包前需要commit界面看一下…...

HTML笔记(2)

列表标签 项目标识符&#xff08;项目符号&#xff09;一般是不需要的 代码演示 改变符号样式&#xff0c;type属性 表格标签 代码演示 练习案例 布局标签 div是块儿级标签&#xff0c;占一整行&#xff1b; span标签不会占一整行&#xff0c;它只占包裹内容的那块儿区域&a…...

前端大屏自适应缩放

简介 前端中大屏往往用于展示各种炫酷的界面和特效&#xff0c;因此特别受用好欢迎。 但是在开发过程中&#xff0c;常常也会出现各种问题&#xff0c;与一般的页面相比&#xff0c; 最让人头疼的是大屏的自适应问题。使用CSS中transform属性和js获取缩放比例方法 先简单写一下…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...