[Spring]一文明白IOC容器和思想
✅作者简介:大家好,我是Philosophy7?让我们一起共同进步吧!🏆
📃个人主页:Philosophy7的csdn博客
🔥系列专栏: 数据结构与算法
👑哲学语录: 承认自己的无知,乃是开启智慧的大门
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博>主哦🤞

文章目录
- 一、Spring简介
- 1.1、SpringFramework创始人
- 1.2、Spring全家桶
- 1.3、SpringFramework
- 1) Feauture:
- 2) SpringFramework五大模块
- 二、IOC
- 前言:
- Container Overview
- Bean Overview
- 2.1、思想:
- 2.2、IOC容器的实现
- 2.3、基于XML管理Bean
- `实操一:入门案例HelloWorld`
- 1) 创建Maven项目
- 2) 改pom.xml
- 3) 创建HelloWorld类
- 4) 创建配置文件
- 5) 测试
- 执行流程
- `实操二: 获取Bean`
- `实操三: 依赖注入setter方式`
- 1) 创建实体类Person
- 2) 配置Bean并实现属性赋值
- 3) 测试
- `实操四: 依赖注入构造器方式`
- 1) 编写有参构造
- 2)配置Bean
- 3)测试
- `实操五: 特殊值处理`
- `实操六: 为引用类型赋值(级联赋值)`
- 1) 创建身份证类IdCard
- 2) 修改Person类
- 3) 配置Bean
- 4) 测试
一、Spring简介
[Spring | Home](https://spring.io/)官网地址,由于Spring是国外网站,可能访问速度会有点慢。

Spring使创建Java企业应用程序变得容易。它提供了在企业环境中使用Java语言所需的一切,支持Groovy和Kotlin作为JVM上的替代语言,并根据应用程序的需要灵活地创建多种体系结构。从Spring Framework 5.1开始,Spring需要JDK 8+ (Java SE 8+),并提供对JDK 11 LTS的开箱即用支持。Java SE 8 update 60被建议作为Java 8的最低补丁版本,但通常建议使用最新的补丁版本。
Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。
Spring 框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的,并且于 2003 年 6 月首 次在 Apache 2.0 许可下发布。 Spring 是轻量级的框架,其基础版本只有 2 MB 左右的大小。
Spring 框架的核心特性是可以用于开发任何 Java 应用程序,但是在 Java EE 平台上构建 web 应 用程序是需要扩展的。 Spring 框架的目标是使 J2EE 开发变得更容易使用,通过启用基于 POJO 编程模型来促进良好的编程实践。
1.1、SpringFramework创始人
Rod Johnson,Spring框架的创始人,同时也是SpringSource的联合创始人。Spring是面向切面编程(AOP)和控制反转(IoC)的容器框架。

1.2、Spring全家桶
[Spring | Projects](https://spring.io/projects)
在该链接可以看出Spring的生态包含哪些,在这我列举我们常用的Spring Framework、SpringBoot、SpringCloud、SpringSecurity、SpringAMQP等
1.3、SpringFramework
以Spring为基础框架,可以把Spring看作成地基,基本上所有的Spring项目都是以SpringFramework为基础的。
1) Feauture:
- Core technologies: dependency injection, events, resources, i18n, validation, data binding, type conversion, SpEL, AOP.
- Testing: mock objects, TestContext framework, Spring MVC Test,
WebTestClient - Data Access: transactions, DAO support, JDBC, ORM, Marshalling XML.
- Spring MVC and Spring WebFlux web frameworks.
- Integration(集成): remoting, JMS, JCA, JMX, email, tasks, scheduling, cache.
- Languages: Kotlin, Groovy, dynamic languages.
核心技术: 依赖注入(Dependency injection 简称DI)、事件、数据绑定、SPEL表达式、AOP面向切面等
测试: SpringMVC测试、WebTestClient等
数据访问: 事务、支持DAO、JDBC、ORM、XML
2) SpringFramework五大模块
| 功能模块 | 功能介绍 |
|---|---|
| Core Container | 核心容器,在 Spring 环境下使用任何功能都必须基于 IOC 容器。 |
| AOP&AspectJs | 面向切面编程 |
| Testings | 提供了对 junit 或 TestNG 测试框架的整合。 |
| Data Access/Integration | 提供了对数据访问/集成的功能。 |
| Spring MVC | 提供了面向Web应用程序的集成功能 |
二、IOC
Inversion of Control,反转控制。那么什么是控制反转呢,就是将对象的创建权改变了,创建对象的任务交给IOC容器进行管理。
//原始创建方式 --- 采用new的方式来创建对象
Object obj = new Object();
前言:
Container Overview
The org.springframework.context.ApplicationContext interface represents the Spring IoC container and is responsible for instantiating, configuring, and assembling the beans. The container gets its instructions on what objects to instantiate, configure, and assemble by reading configuration metadata. The configuration metadata is represented in XML, Java annotations, or Java code. It lets you express the objects that compose your application and the rich interdependencies between those objects.
Several implementations of the ApplicationContext interface are supplied with Spring. In stand-alone applications, it is common to create an instance of ClassPathXmlApplicationContext or FileSystemXmlApplicationContext. While XML has been the traditional format for defining configuration metadata, you can instruct the container to use Java annotations or code as the metadata format by providing a small amount of XML configuration to declaratively enable support for these additional metadata formats.
In most application scenarios, explicit user code is not required to instantiate one or more instances of a Spring IoC container. For example, in a web application scenario, a simple eight (or so) lines of boilerplate web descriptor XML in the web.xml file of the application typically suffices (see Convenient ApplicationContext Instantiation for Web Applications). If you use the Spring Tools for Eclipse (an Eclipse-powered development environment), you can easily create this boilerplate configuration with a few mouse clicks or keystrokes.
Bean Overview
A Spring IoC container manages one or more beans. These beans are created with the configuration metadata that you supply to the container (for example, in the form of XML <bean/> definitions).
Within the container itself, these bean definitions are represented as BeanDefinition objects, which contain (among other information) the following metadata:
- A package-qualified class name: typically, the actual implementation class of the bean being defined.
- Bean behavioral configuration elements, which state how the bean should behave in the container (scope, lifecycle callbacks, and so forth).
- References to other beans that are needed for the bean to do its work. These references are also called collaborators or dependencies.
- Other configuration settings to set in the newly created object — for example, the size limit of the pool or the number of connections to use in a bean that manages a connection pool.
以上内容来源于官网,为避免翻译难免有失偏颇,可自行翻译
2.1、思想:
IOC容器的引入,让我们的开发变的快捷、方便、高效,且IOC容器能够解耦合降低类与类之间的依赖关系。
①获取资源的传统方式:
传统的方式是组件主动的从容器中获取所需要的资源,在这样的 模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效 率。
②反转控制方式获取资源:
只需要将资源放入到容器之中,容器如何创建对象开发人员不需要关心,只需要明白如何从容器中获取这个资源即可。
③DI
DI(Dependency Injection) 依赖注入
DI 是 IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器 的资源注入。相对于IOC而言,这种表述更直接。
所以结论是:IOC 就是一种反转控制的思想, 而 DI 是对 IOC 的一种具体实现。
2.2、IOC容器的实现
Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建 bean 之前,首先需要创建 IOC 容器。Spring 提供了 IOC 容器的两种实现方式:
- BeanFactory
- 这是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。
- ApplicationContext
- BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用 ApplicationContext 而不是底层的 BeanFactory。
ApplicationContext的实现类

| 类型名 | 简介 |
|---|---|
| ClassPathXmlApplicationContext | 通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象 |
| FileSystemXmlApplicationContext | 通过文件系统路径读取 XML 格式的配置文件创建 IOC 容 器对象 |
| ConfigurableApplicationContext | ApplicationContext 的子接口,包含一些扩展方法 refresh() 和 close() ,让 ApplicationContext 具有启动、 关闭和刷新上下文的能力。 |
| WebApplicationContext | 专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对 象,并将对象引入存入 ServletContext 域中。 |
2.3、基于XML管理Bean
实操一:入门案例HelloWorld
1) 创建Maven项目
用maven项目管理工具,来对项目进行管理
2) 改pom.xml
<dependencies><!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.1</version></dependency><!-- junit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>
3) 创建HelloWorld类
public class HelloWorld {//编写方法public void sayHello(){System.out.println("Hello World");}
}
4) 创建配置文件
在resource包下创建applicationContext.xml,通常都是以该文件名命名

<?xml version="1.0" encoding="UTF-8"?>
<!--Spring约束 不用记 直接编写-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--通过Bean标签将HelloWorld实例交给Spring IOC容器管理id: bean的唯一表示class: 设置bean对应的全类名
--><bean id="helloWorld" class="com.philosophy.spring.bean.HelloWorld"></bean>
</beans>
5) 测试
@Test
public void test() {//通过xml文件的方式来管理BeanApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//2.获取Bean对象 getBean可传递Bean的ID 或 对应的Class类对象HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");//3.调用方法helloWorld.sayHello();
}
执行流程

1.创建组件类 --> 2.将组件配置到配置文件中 3.创建IOC容器对象 读取配置文件中的Bean 4.获取IOC中容器的对象 5.完成特定功能
实操二: 获取Bean
①方式一: 根据Bean的ID获取:
由于 id 属性指定了 bean 的唯一标识,所以根据 bean 标签的 id 属性可以精确获取到一个组件对象。 上个实验中我们使用的就是这种方式
//根据Bean的唯一标识来获取
HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
②方式二: 根据类型获取
HelloWorld helloWorld = context.getBean(HelloWorld.class);
③方式三:根据ID和类型获取
HelloWorld bean = context.getBean("helloWorld", HelloWorld.class);
④注意:
当根据类型获取Bean时,要求IOC容器中指定的类型Bean只能有一个
当IOC容器中一共配置了两个相同的类型时
<bean id="helloWorld" class="com.philosophy.spring.bean.HelloWorld"></bean>
<bean id="helloWorldTwo" class="com.philosophy.spring.bean.HelloWorld"></bean>
根据类型时获取Bean就会抛出异常
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.philosophy.spring.bean.HelloWorld' available: expected single matching bean but found 2: helloWorld,helloWorldTwo
实操三: 依赖注入setter方式
1) 创建实体类Person
package com.philosophy.spring.bean;public class Person {private Integer id; //IDprivate String name; //name名称private Integer age; //名称public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}
2) 配置Bean并实现属性赋值
<bean id="person" class="com.philosophy.spring.bean.Person"><!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 --><!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关) --><!-- value属性:指定属性值 --><property name="id" value="1001"/><property name="name" value="张三"/><property name="age" value="20"/>
</bean>
3) 测试
@Test
public void testPerson() {//1.创建IOC容器ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//2.获取对象Person person = context.getBean(Person.class);System.out.println(person);
}
实操四: 依赖注入构造器方式
1) 编写有参构造
public Person(Integer id,String name,Integer age) {this.id = id;this.name = name;this.age = age;
}
2)配置Bean
<bean id="personTwo" class="com.philosophy.spring.bean.Person"><!--对照构造器中的参数顺序 一一赋值--><constructor-arg value="1002"/><constructor-arg value="李四"/><constructor-arg value="33"/>
</bean>
3)测试
@Test
public void testPerson02() {//1.创建IOC容器ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//2.获取对象Person person = (Person) context.getBean("personTwo");System.out.println(person);
}
实操五: 特殊值处理
①、什么是字面量?
//声明一个变量
int a = 10;
声明一个变量a,初始化值为10,此时a代表的是一个变量名称,当我们引用a时获取的是其值10
若a是一个带引号的'a',那么它就不是一个变量,它就是这个字母的本身,这就是字面量
<!-- 使用value属性给bean的属性赋值时,Spring会把value属性的值看做字面量 -->
<property name="name" value="张三"/>
②、null值
<!--为name属性 赋值为Null-->
<property name="name"><null />
</property><property name="name" value="null"></property> <!--等同于该操作-->
③CDATA
<property name="expression"><!-- 解决方案二:使用CDATA节 --><!-- CDATA中的C代表Character,是文本、字符的含义,CDATA就表示纯文本数据 --><!-- XML解析器看到CDATA节就知道这里是纯文本,就不会当作XML标签或属性来解析 --><!-- 所以CDATA节中写什么符号都随意 --><value><![CDATA[a < b]]></value>
</property>
实操六: 为引用类型赋值(级联赋值)
1) 创建身份证类IdCard
package com.philosophy.spring.bean;/*** 身份证类*/
public class IdCard {private String id; //身份证号public IdCard(String id) {this.id = id;}public IdCard() {}public String getId() {return id;}public void setId(String id) {this.id = id;}
}
2) 修改Person类
添加以下代码:
private IdCard idCard; //身份证号public IdCard getIdCard() {return idCard;
}public void setIdCard(IdCard idCard) {this.idCard = idCard;
}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", idCard=" + idCard +'}';}
3) 配置Bean
<bean id="idCard" class="com.philosophy.spring.bean.IdCard"><property name="id" value="10086"/></bean><bean id="personThree" class="com.philosophy.spring.bean.Person"><property name="id" value="1003"/><property name="name" value="鸡哥"/><property name="age" value="23"/><!--ref属性: 引用IOC容器中某个Bean的id 将所对应的Bean为属性赋值--><property name="idCard" ref="idCard"/></bean>
4) 测试
@Testpublic void testPersonAndIdCard() {//1.创建IOC容器ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//2.获取对象Person person = (Person) context.getBean("personThree");System.out.println(person);}
相关文章:
[Spring]一文明白IOC容器和思想
✅作者简介:大家好,我是Philosophy7?让我们一起共同进步吧!🏆 📃个人主页:Philosophy7的csdn博客 🔥系列专栏: 数据结构与算法 👑哲学语录: 承认自己的无知,乃…...
程序人生 | 与足球共舞的火柴人(致敬格拉利什,赋予足球更深的意义)
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…...
MATLAB | R2023a更新了哪些好玩的东西
R2023a来啦!!废话不多说看看新版本有啥有趣的玩意和好玩的特性叭!!把绘图放最前面叭,有图的内容看的人多。。 1 区域填充 可以使用xregion及yregion进行区域填充啦!! x -10:0.25:10; y x.^…...
Python Module — OpenAI ChatGPT API
目录 文章目录目录OpenAI Python SDKopenai.ChatCompletion 模块openai.ChatCompletion.create 函数OpenAI Python SDK 官方文档:https://platform.openai.com/docs/api-reference/introduction OpenAI Python SDK 用于开发与 OpenAI RESTful API 进行交互的客户端…...
Docker学习记录
阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!! 文章目录阅读前请看一下:我是一…...
Linux-VIM使用
文章目录前言VIM使用1、切换模式2、跳转(1) 跳转到指定行(2) 跳转到首行(3) 跳转到末行3、自动格式化程序4. 大括号对应5. 删除(1)删除一个单词(2)删除光标位置至行尾(3)删除光标位置至行首(4&a…...
Windows安全中心内存完整性无法打开问题的处理方法
Windows11安全中心内存完整性无法打开 今天电脑使用过程中突然看到系统桌面右下角任务栏中 windows安全中心图标出现了警告信息,如下图红框所示: 点击该图标进入windows安全中心的 安全性概览 界面,如下图: 在该界面可以看到出现安…...
在芯片设计行业,从项目的初期到交付,不同的岗位的工程师主要负责什么?
大家都知道在芯片设计行业,项目是至关重要的一环。从项目的初期到交付,不同的岗位的工程师在项目的各环节主要负责什么?他们是怎样配合的?下面看看资深工程师怎么说。 一个项目,从初期到交付的过程是比较漫长的。我们知道最早的时候&#…...
Spring Cloud Alibaba全家桶(七)——Sentinel控制台规则配置
前言 本文小新为大家带来 Sentinel控制台规则配置 相关知识,具体内容包括流控规则(包括:QPS流控规则,并发线程数流控规则),BlockException统一异常处理,流控模式(包括:直…...
mysql-installer安装教程(详细图文)
目录 1.安装 2.配置系统环境变量 3.配置初始化my.ini文件 4.MySQL彻底删除 5.Navicat 安装 1.安装 先去官网下载需要的msi,在这放出官网下载地址下载地址 这里我具体以8.0.28 为安装例子,除了最新版安装界面有些变动以往的都是差不多的。 过去的版本…...
微服务架构第一阶段(nacos,gateWay,RPC)
最近在学习完 springcloud 微服务架构之后,自己用了之前的一个项目计划拆分成微服务的项目,第一阶段要求整合 nacos,RPC以及gateWay,首先来看一下几个技术组件的概念 RPC RPC 框架 —— 远程过程调用协议RPC(Remote …...
【Azure 架构师学习笔记】-Azure Data Factory (5)-Managed VNet
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器 前言 PaaS服务默认都经过公网传输, 这对很多企业而言并不安全,那么就需要对其进行安全改…...
ActiveMQ(三)
协议配置 ActiveMQ 支持的协议有 TCP 、 UDP、NIO、SSL、HTTP(S) 、VM 这是activemq 的activemq.xml 中配置文件设置协议的地方 <transportConnector name"openwire" uri"tcp://0.0.0.0:61616?maximumCon nections1000&wireFormat.maxFrameSiz…...
区块链多方计算 人工智能学习笔记
区块链:让数据不被篡改,但需要复制数据给每一块,造成数据泄露 多方计算 : 让数据用途可控。数控可用但不可见。 人工智能:数据更难造假 主讲人简介: 徐葳,宾夕法尼亚大学学士(在清华…...
基于opencv的边缘检测方法
1、梯度运算 用OpenCV的形态变换( 膨胀、腐蚀、开运算和闭运算)函数morphologyEx 梯度运算即膨胀结果-腐蚀结果: 【注意】对于二值图像来说,必须是前景图像为白色,背景为黑色,否则需要进行反二值化处理 …...
视频封装格式篇(TS)
本篇介绍下TS的封装格式。 1.什么是TS? TS(Transport Stream,传输流),一种常见的视频封装格式,是基于MPEG-2的封装格式(所以也叫MPEG-TS),后缀为.ts。 2.TS的分层结构 …...
静态路由+DHCP实验(四路由器八PC)
一.200.1.1.0/24子网划分 1.划分八个子网 2.选用前5个,第五个子网再划分4个子网作为骨干 二.规划路由 三.配置(下一跳) 1.先依次实现四个路由器之间全网可通 2.为路由器配置地址池,使用全局模式获取dhcp,指定网关…...
数据挖掘(作业汇总)
目录 环境配置 实验1 数据 作业2 环境配置 实验开始前先配置环境 以实验室2023安装的版本为例: 1、安装anaconda:(anaconda自带Python,安装了anaconda就不用再安装Python了) 下载并安装 Anaconda3-2022.10-Windows-x86_64.ex…...
基于微信小程序的图书馆选座系统源码
开发环境及工具: 大等于jdk1.8,大于mysql5.5,idea(eclipse),微信开发者工具 技术说明: springboot mybatis 小程序 代码注释齐全,没有多余代码,适合学习(…...
K8S 三种探针 readinessProbe、livenessProbe和startupProbe
一、POD状态 Pod 常见的状态 Pending:挂起,我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件。已经创建了但是没有适合它运行的节点叫做挂起,这其中也包含集群为容器创建网络…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
