Java 5.1 - Spring

news2024/9/22 9:53:21

Spring 基础

什么是 Spring 框架?

开源的 轻量级的 Java 开发框架,旨在提高开发效率和系统可维护性。

一般我们说 Spring 都是指 Spring FrameWork,它是很多模块的集合,使用这些模块可以很方便地帮助我们进行 Java 开发。例如 Spring 中集合了 IoC、AOP,我们通过 Spring 可以很方便地访问数据库、方便集成第三方组件、对单元测试支持比较好。

Spring 最核心的思想就是不用重新造轮子,开箱即用,提高效率。

Spring 的核心功能是 IoC 和 AOP。

Spring 包含的模块有哪些?

各个模块之间的依赖:

Core Container

Spring 框架的核心模块,也可以说是基本模块,主要提供 IoC 依赖注入功能的支持。Spring 其他所有的模块基本都要依赖该模块,也就是上图依赖关系。

spring-core:Spring 框架基本的核心工具类

spring-context:提供对国际化、事件传播(?)、资源加载等功能支持

spring-beans:提供对 bean 的操作

spring-expression:提供对表达式语言(Spring Expression Language)SpEL 的支持,只依赖于 core 模块,可以单独使用

AOP

Data Access / Integration

Spring Web

Messaging

Spring Test

Spring,Spring MVC,Spring Boot 之间是什么关系?

Spring 包含了多个功能框架,最重要的是 Spring-Core(IoC)模块,Spring 中的其他模块基本都需要依赖 Spring-Core 模块。

Spring MVC 是 Spring 中的一个重要模块,它赋予 Spring 快速构建 MVC 架构的 Web 程序的能力。MVC 中 M 是 model(模型)、V 是 view(视图)、C 是 controller(控制器)。其核心思想是通过将业务逻辑、数据、显示分离来组织代码。

Spring Boot 的产生是由于使用 Spring 进行开发各种配置过于麻烦,Spring Boot 可以简化 Spring 的开发。(简化框架)如果你需要构建 MVC 架构的 Web 程序,你还是需要使用 Spring MVC 作为 MVC 框架,只是说 Spring Boot 帮你简化了 Spring MVC 的各种配置,真正做到开箱即用。

Spring IoC

谈谈你对 Spring IoC 的理解

IoC,全称控制反转(Inverse of Control),它是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原来在程序中控制的各类对象,交给 Spring 框架进行管理。不过 IoC 并非 Spring 特有,在其他语言也有应用。

为什么叫控制反转?

控制:对象创建的权利

反转:将控制权交给外部环境(Spring、IoC 容器)

我们将对象之间的依赖关系交给 IoC 容器来管理,并且由 IoC 容器来完成对象的注入。这样可以很大程度上简化开发,把应用从复杂的依赖关系中解放出来。当我们需要创建一个对象的时候,只需要配置好文件/注解即可,不需要考虑对象是如何被创建的。

在 Spring 中,IoC 容器是 Spring 用来实现 IoC 的载体,IoC 容器实际上就是个 Map,Map 中存放的是各种对象。

什么是 Spring Bean?

Bean 就是 IoC 代为管理的对象。

我们需要告诉 IoC 容器帮助我们管理那些对象,这个对象是通过配置元数据来定义的。

将一个类声明为 Bean 的注解有哪些?

@Component:通用注解。

@Repository:对应持久层即 DAO 层,用于数据库相关操作。

@Service:对应服务层,主要涉及复杂的逻辑,需要用到 DAO 层。

@Controller:对应 Spring MVC 控制层,主要是接受用户请求并调用 Service 层返回数据给前端页面。

@Component 和 @Bean 有什么区别?

@Component 注解作用与类;@Bean 注解作用于方法。

@Component 通常通过类路径扫描来自动侦测以及自动装配到 Spring 容器中;@Bean 通常是我们在标有该注解的方法中定义产生这个 bean,@Bean 告诉 Spring 这是某个类的实例,当我需要它的时候还给我。

@Bean 自定义性更强,我们引用第三方库中的类需要装配到 Spring 容器时,只能通过 @Bean 实现。

注入 Bean 的注解有哪些?

Spring 内置的 @Autowired 以及 JDK 内置的 @Resource 和 @Inject 都可以用于注入 Bean。

@Autowired 和 @Resource 的区别是什么?

@Autowired 属于 Spring 提供的注解。它的默认注入方法是 byType,也就是通过接口的类型进行匹配注入 Bean。如果一个接口存在多个实现类,不能通过 byType 方式进行注入,此时就会转变为 byName 方式进行注入(类名)。

我们建议通过@Qualifier 注解来指定名称而不是依赖变量的名称。

@Resource 是 JDK 提供的注解,默认注入方式为 byName。如果无法通过名称进行匹配的话,注入方式会变成 byTpye。

@Resource 有两个比较重要且日常开发常用的属性:name、type。如果仅指定 name 则注入方式为 byName,如果仅指定 type 则注入方式为 byType,如果同时制定(不建议),则注入方式为 byType + byName。

Bean 的作用域有哪些?

1、singleton:单例

2、prototype:每次获取得到一个新的 bean 实例

3、request:每次 HTTP 请求都会产生一个新的 bean

4、session:每次来自新 session 的 HTTP 请求都会产生一个新的 bean

5、application/global-session:每个 Web 应用在启动的时候创建一个 bean

6、websocket:每一次 WebSocket 会话产生一个新的 bean

如何配置 bean 的作用域呢?

注解方式:

单例 Bean 的线程安全问题了解吗?

单例 Bean 存在线程安全问题,主要是因为 多线程操作同一个对象存在的资源竞争。

常见的解决办法:

1、Bean 中避免定义可变的成员变量

2、在类中定义 ThreadLocal 的成员变量,将需要的可变成员保存在 ThreadLocal 中。

大部分 Bean 实际都是无状态(无实例变量)的,此时单例 Bean 是线程安全的。

Bean 的生命周期

这里讲解的是 ApplicaitonContext 中 Bean 的生命周期。而实际上 BeanFactory 也是差不多的,只不过处理器需要手动注册。

Spring AOP

谈谈自己对 AOP 的了解

AOP,全称面向切面编程(Aspect-Oriented Programming),可以将与业务逻辑无关,但是却为业务模块所共同调用的逻辑或责任(日志、事务处理、权限控制)等封装起来,以减少代码的重复性,降低模块之间的耦合程度,有利于未来的可拓展性和可维护性。

Spring AOP 是基于动态代理的,如果需要代理的对象实现了某个接口,那么Spring AOP 会使用 JDK Proxy 去创建代理对象;而对于没有实现接口的对象,Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理,如下所示:

我们也可以使用 AspectJ,现在 Spring AOP 中已经集成了 AspectJ,它是 Java 生态中最完整的 AOP 框架。

Spring AOP 和 AspectJ AOP 有什么区别?

Spring AOP 属于运行时增强,AspectJ 属于编译时增强。Spring AOP 基于代理(proxying),而AspectJ 基于字节码操作。

如果我们的切面比较少,那么两者的性能差异并不大,但是当切面很多的时候,最好选择 AspectJ,它比 Spring AOP 快很多。

AspectJ 定义的通知类型有哪些?

1、Before

2、After

3、AfterReturning:目标对象的方法调用完成,在返回结果前触发

4、AfterThrowing

5、Around:环绕通知,它是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象以及要执行的方法,它可以任意在目标对象前后进行操作。

多个切面的执行顺序如何控制?

1、使用 @Order 注解直接定义切面顺序(值越小优先级越高)

2、实现 Ordered 接口重写 getOrder 方法

Spring MVC

说说自己对 Spring MVC 的了解?

MVC 是 Model、View、Controller 的简写,它的思想是通过将业务逻辑、数据、显示进行分离来组织代码。

Spring MVC 框架是当前最优秀的 MVC 框架。它可以帮助我们进行更简洁的 Web 开发,并且它天生与 Spring 框架集成。Spring MVC 下我们一般把后端项目分为 Service 层、Dao 层、Entity 层、Controller 层。

Spring MVC 的核心组件有哪些?

DispatcherServlet:核心的中央处理器

HandlerMapping:处理器映射器

HandlerAdapter:处理器适配器

Handler:请求处理器

ViewResolver:视图解析器

流程:

1、客户端发送请求,DispatcherServlet 拦截请求

2、DispatcherServlet 根据请求信息调用 HandlerMapping。HandlerMapping 根据 url 去匹配查找能够处理该请求的 Handler(也就是我们平时说的 Controller 控制器),并会将请求涉及到的拦截器和 Handler 一起封装。

3、DispatcherServlet 调用 HandlerAdapter 适配执行 Handler

4、Handler 完成对用户的请求处理后,返回一个 ModelAndView 对象给 DispatcherServlet,ModelAndView 顾名思义包含了数据模型和视图信息。

5、ViewResolver 根据逻辑 View 查找实际的 View

6、DispatcherServlet 把返回的 Model 传给 View(视图渲染)

7、把 View 的结果返回给客户端。

统一异常处理怎么做?

推荐使用注解的方式进行统一异常处理,具体使用 @ControllerAdvice + @ExceptionHandler 这两个注解。

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(BaseException.class)
public ResponseEntity<?> handleAppException(BaseException ex,
HttpServletRequest request) {
//......
 }
@ExceptionHandler(value = ResourceNotFoundException.class)
public ResponseEntity<ErrorReponse>
handleResourceNotFoundException(ResourceNotFoundException ex, HttpServletRequest
request) {
//......
 }
}

这种异常处理方式下,会给所有或者指定的 Controller 织入异常处理的逻辑(AOP),当 Controller 中的方法抛出异常的时候,由被 @ExceptionHandler 注解修饰的方法进行处理。

Spring 框架中用到了哪些设计模式?

Spring 事务

Spring 管理事务的方式有几种?

1、编程式事务:通过 TransactionTemplate 或者 TransactionManager 手动管理事务,但在实际中很少进行使用,因为它对代码的侵入性过强,但对我们理解 Spring 事务管理的原理是有帮助的。

2、声明式事务:在 XML 配置文件中配置或者直接基于 @Transcational 注解(推荐):实际山是通过 AOP 进行实现的。

使用 TransactionTemplate:

@Autowired
private TransactionTemplate transactionTemplate;
public void testTransaction() {

        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {

                try {

                    // ....  业务代码
                } catch (Exception e){
                    //回滚
                    transactionStatus.setRollbackOnly();
                }

            }
        });
}

使用注解:

@Transactional(propagation = Propagation.REQUIRED)
public void aMethod {
  //do something
  B b = new B();
  C c = new C();
  b.bMethod();
  c.cMethod();
}

一般在业务中我们都用的是声明式事务

Spring 事务中有哪几种事务传播行为?

在 Spring 的事务管理中,有三个最重要的接口:

1、PlatformTransactionManager:事务管理器,核心接口

2、TransactionDefinition:事务定义信息(传播行为、隔离等级、超时、只读、回滚策略)

3、TransactionStatus:事务运行状态

我们可以把 PlatformTransactionManager 看成是上层的管理者,而 TransactionDefinition 和 TransactionStatus 都是对事物的描述。

事务传播行为是在 TransactionDefinition 中进行定义的,它的存在是为了解决业务层方法相互调用而产生的。

下面举一个例子:

@Service
Class A {
    @Autowired
    B b;
    @Transactional(propagation = Propagation.xxx)
    public void aMethod {
        //do something
        b.bMethod();
    }
}

@Service
Class B {
    @Transactional(propagation = Propagation.xxx)
    public void bMethod {
       //do something
    }
}

这里方法a会去调用方法b,且方法a、b都被 @Transactional 进行注解,如果方法a或者方法b回滚的时候,会对另外一个方法造成怎么样的影响?这就是事务传播行为需要干的事情。

在 TransactionDefinition 中定义了如下常量:

public interface TransactionDefinition {
    int PROPAGATION_REQUIRED = 0;
    int PROPAGATION_SUPPORTS = 1;
    int PROPAGATION_MANDATORY = 2;
    int PROPAGATION_REQUIRES_NEW = 3;
    int PROPAGATION_NOT_SUPPORTED = 4;
    int PROPAGATION_NEVER = 5;
    int PROPAGATION_NESTED = 6;
    ......
}

1、TransactionDefinition.PROPAGATION_REQUIRED

这是默认的事务传播行为,也是使用的最多的一个事务传播行为。如果当前存在事务,则加入该事务;如果不存在,则新建一个事务。

在此例中相当于,如果我们上面的aMethod()bMethod()使用的都是PROPAGATION_REQUIRED传播行为的话,两者使用的就是同一个事务,只要其中一个方法回滚,整个事务均回滚。

2、TransactionDefinition.PROPAGATION_REQUIRES_NEW

创建一个新的事务,如果当前存在事务,则把当前的事务挂起。

如果我们上面的bMethod()使用PROPAGATION_REQUIRES_NEW事务传播行为修饰,aMethod还是用PROPAGATION_REQUIRED修饰的话。如果aMethod()发生异常回滚,bMethod()不会跟着回滚,因为 bMethod()开启了独立的事务。但是,如果 bMethod()抛出了未被捕获的异常并且这个异常满足事务回滚规则的话,aMethod()同样也会回滚,因为这个异常被 aMethod()的事务管理机制检测到了。

3、TransactionDefinition.PROPAGATION_NESTED

如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;

如果方法a回滚,则方法b也会回滚;如果方法b回滚,方法a不会回滚。

4、TransactionDefinition.PROPAGATION_MANDATORY

使用的很少。如果当前存在事务,则加入该事务;如果没事务,则抛出异常。

Spring 事务中的隔离级别有哪几种?

一共五种

public interface TransactionDefinition {
    ......
    int ISOLATION_DEFAULT = -1;
    int ISOLATION_READ_UNCOMMITTED = 1;
    int ISOLATION_READ_COMMITTED = 2;
    int ISOLATION_REPEATABLE_READ = 4;
    int ISOLATION_SERIALIZABLE = 8;
    ......
}

1、default:使用后端数据库默认的隔离级别

2、读未提交

3、读已提交

4、可重复读

5、可串行化

@Transactional(rollbackFor = Exception.class)注解了解吗?

类:类中所有 public 方法

方法:仅限 public 方法

rollbackFor 属性:不加则只有遇到 RuntimeException 才会回滚;加了之后可以让事务在遇到 非运行时异常时也可以回滚

Spring Data JPA

JPA 重要的是实战,对小部分知识点进行总结

如何使用 JPA 在数据库中非持久化一个字段?

不想让某个字段被持久化,也就是不被数据库存储

一般使用后面两种方式是比较多的

JPA 的审计功能是做什么的?有什么用?

审计功能帮助我们记录数据库操作的具体行为:某条记录是谁创建的、什么时候创建的、最后修改人是谁、最后修改时间等等。

@Data
@AllArgsConstructor
@NoArgsConstructor
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public abstract class AbstractAuditBase {
    @CreatedDate
    @Column(updatable = false)
    @JsonIgnore
    private Instant createdAt;

    @LastModifiedDate
    @JsonIgnore
    private Instant updatedAt;

    @CreatedBy
    @Column(updatable = false)
    @JsonIgnore
    private String createdBy;

    @LastModifiedBy
    @JsonIgnore
    private String updatedBy;
}

实体之间的关联关系注解有哪些?

1、@OneToOne

2、@ManyToMany

3、@OneToMany

4、@ManyToOne

Spring Security

Spring Security 重要的也是实战,这里仅对小部分知识点进行总结。

有哪些控制请求访问权限的方法?

hasRole 和 hasAuthority 有区别吗?

单纯从源码上看,它们的区别就在于 hasAuthority 不会加前缀;而 hasRole 会自动加上 ROLE_ 前缀。

为什么要这么做?

这是一个设计上的思想,authority 可以说是一个具体的权限,针对某一个功能(例如针对某一个数据的修改或删除);而对于 role 而言,它是很多个 authority 的集合。在项目中,我们可以将用户和角色关联,角色和权限关联,权限和资源关联。

如何对密码进行加密?

如果需要保存密码这类敏感信息到数据库的话,需要先加密再进行保存。

Spring Security 提供了多种加密算法的实现,开箱即用,非常方便。这些加密算法的父类是 PasswordEncoder,如果我们想要自己实现一个加密算法,也需要继承它。

一共三个必须实现的方法:

public interface PasswordEncoder {
    // 加密也就是对原始密码进⾏编码
    String encode(CharSequence var1);
    // ⽐对原始密码和数据库中保存的密码
    boolean matches(CharSequence var1, String var2);
    // 判断加密密码是否需要再次进⾏加密,默认返回 false
    default boolean upgradeEncoding(String encodedPassword) {
        return false;
    }
}

官方推荐使用基于 bcrypt 强哈希函数的加密算法实现类。

如何更换系统中使用的加密算法?

推荐做法是通过 DelegatingPasswordEncoder 兼容多种不同的密码加密方案,以适应不同的业务需求。

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

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

相关文章

监控电脑屏幕的软件叫什么?8款好用的监控电脑屏幕的软件推荐!

远程办公和数字化管理的风潮席卷而来&#xff0c;电脑屏幕监控软件已经悄然成为了企业和家庭不可或缺的得力助手。 这些神奇的小工具&#xff0c;不仅能让老板们远程监督员工的工作状态&#xff0c;确保团队高效运转&#xff0c;还能守护企业的信息安全。 接下来&#xff0c;…

JavaEE-传输层协议

目录 一、UDP协议 二、TCP协议 TCP报文结构 TCP十大核心机制 确认应答 超时重传 接收缓冲区 连接管理 建立连接 断开连接 一、UDP协议 学习一个网络协议首先要学习报文结构。 对于UDP协议来说&#xff0c;应用层数据到达UDP后就会给应用层数据加上UDP报头。 &#…

STM32G474的HAL_ADC_Start_DMA()传递指针问题

1、HAL_ADC_Start_DMA()传递指针问题 函数传递参数中若用到指针&#xff0c;则要注意指针的类型和源数据数据类型要保持一致&#xff0c;否则&#xff0c;会导致内存溢出。 STM32G474的ADC值是12位&#xff0c;HAL库用的是32位指针传输数据&#xff0c;因此&#xff0c;在定义保…

深度学习入门-09

基于小土堆学习 1、卷积层 卷积操作涉及到一个称为“卷积核”或“滤波器”的小窗口&#xff0c;在输入数据上滑动&#xff0c;并对每个位置上的数据进行加权求和&#xff0c;可能还会加上一个偏置项。这个加权求和的结果就构成了输出特征图&#xff08;feature map&#xff0…

SS-31;Elamipretide;伊拉米肽;线粒体靶向抗氧化剂SS-31肽;CAS:736992-21-5

【SS-31 简介】 SS-31肽是一种心磷脂过氧化物酶抑制剂和线粒体靶向肽。 它可以改善左心室和线粒体功能。SS-31肽可减轻 人小梁网状细胞中的线粒体功能障碍和氧化损伤。它可以防止iHTM和GTM(3)细胞受到H2O2诱导的持续氧化应激。慢性心力衰竭和线粒体肌病的I期临床试验正在进行中…

EPLAN中绘制多线原理图以及插入符号元件

EPLAN中绘制多线原理图以及插入符号元件 如下图所示&#xff0c;新建并打开多线原理图&#xff0c;点击菜单栏中的插入—电位连接点&#xff0c; 插入所需的电位连接点&#xff1b; 如下图所示&#xff0c;点击项目数据—符号&#xff0c;这样可以打开符号选择的导航器&#…

07 - procfs

---- 整理自 王利涛老师 课程 实验环境&#xff1a;宅学部落 www.zhaixue.cc 文章目录 1. procfs 快速入门2. procfs 文件创建的回调机制3. 在 proc 目录下创建子目录4. 通过 proc 接口修改内核变量5. 通过 proc 接口访问数组6. 序列文件&#xff1a;seq_file 编程接口7. seq_f…

Hbase离线迁移

假设是hbase集群&#xff0c;那么数据存储在hdfs上。 1.关闭2个hbase 2.使用distcp 将hdfs上的hbase数据迁移到另一个【相同路径】的hdfs上。 不知道目录的话&#xff0c;可以find / -name hbase-site.xml找一下。 hadoop distcp -Dmapreduce.job.hdfs-servers.token-renew…

XtQuant接口概述,想用miniQMT做量化哪家券商支持?

XtQuant.XtData 行情模块 xtdata是xtquant库中提供行情相关数据的模块&#xff0c;本模块旨在提供精简直接的数据满足量化交易者的数据需求&#xff0c;作为python库的形式可以被灵活添加到各种策略脚本中。 主要提供行情数据&#xff08;历史和实时的K线和分笔&#xff09;、…

无人机喊话器详解!!!

无人机喊话器&#xff0c;也被称为无人机扬声器&#xff0c;是一种安装在无人机上&#xff0c;用于通过空中向地面人员传递声音的设备。 一、功能特点 远程传递声音&#xff1a;无人机喊话器能够在较远的距离内清晰地传递声音&#xff0c;有效广播范围通常可达数百米甚至更远…

Linux下单网卡配置多个路由ip方法

Linux下配置网卡ip别名何谓ip别名 用windows的话说&#xff0c;就是为一个网卡配置多个ip。 什么场合增加ip别名能派上用场&#xff1f; 布网需要、多ip访问测试、特定软件对多ip的需要 下面通过几个例子简单介绍一下如何使用ifconfig命令给网卡配置ip别名。 一、首先为服务器…

会员通知短信怎么利用NodeJS发送短信

会员通知群发短信以其即时高效、高打开率、个性化定制、成本效益高、跨平台兼容以及法律合规等优势&#xff0c;在现代会员管理和营销策略中占据了重要地位。对于希望提升会员沟通效率、增强用户粘性和促进业务增长的企业而言&#xff0c;合理利用群发短信工具无疑是一个明智的…

left join 使用 sum()

一&#xff0c;表结构 表一&#xff0c;test_group 分组表 表二&#xff0c;test_user 用户表 test_group 和 test_user 是一对多的关系 二&#xff0c;sql 统计一班的总得分和所有用户的总年龄 SELECT SUM(a.score),SUM(b.age),a.groupname from test_group a LEFT JOIN…

Keepalived高可用配置服务器集群

前言 上章完成了通过nginx对服务器配置了负载均衡,保证了一个服务器宕机另一个服务器顶上,但是有一个问题出现了,如果nginx宕机了怎么办,这章会对这个问题进行讲解,配置集群来保证nginx宕机下一个顶上来,服务器一直能提供服务当一台服务器宕机的时候把从服务器切换为主,提供虚…

【机器人学】7-3.六自由度机器人自干涉检测-圆柱体的旋转变换【附MATLAB代码】

前言 上一章确定了机械臂等效的圆柱体的上下圆心坐标&#xff0c;这篇文章将解决算法三个核心中的第二个核心&#xff1a; 一 根据机械臂的几何数据以及DH参数&#xff0c;确定机械臂等效的圆柱体的上下圆心坐标。 二 将一个圆柱体旋转到与坐标Z轴对齐&#xff0c;另一个圆柱…

华为机考笔试没有结果?

点击上方"互联网求职达人"&#xff0c;选择"设为置顶or星标" 第一时间获取最实用的求职以及备考信息 华为机考笔试范围是什么&#xff1f;​https://mp.weixin.qq.com/s?__bizMzU2NjE0NjMxNg&mid2247483962&idx1&sn69b0b152dd8e7ebe9ddb356b…

livekit 环境搭建

目录 livekit介绍 搭建开发环境 goland编译 运行server 启动server 通过lk命令加入房间 通过web打开本地摄像头 通过goland调试livekit livekit介绍 livekit是一个开源的webrtc服务器&#xff0c;性能十分强大&#xff0c;房间管理、redis、信令业务、流媒体sfu都支…

PMP备考经验 | 如何做到一次考过3A?

一&#xff0c;直播课的学习 面对大量场景阅读题&#xff0c;且刷题也基本没原题的PMP考试&#xff0c;从报名的时候就知道临考刷题大法肯定是行不通的&#xff0c;也想把这个证好好学下去真的成为项目管理专家。 于是第一个周末的直播课两天跟随听课&#xff0c;认真做笔记&am…

数据结构——链表学习

数据结构初步了解 链表是数据结构的一部分&#xff0c;所以我想先理清数据结构的要点&#xff1a; 它们说&#xff1a;程序算法数据结构&#xff0c;在计算机中&#xff0c;把所有可以输入到计算机中能被计算机进行处理的符号的总称叫做数据。 数据结构包括两部分&#xff0…

美畅物联丨物联网平台的标准化之路:物模型设计的创新及应用

随着物联网&#xff08;IoT&#xff09;技术以前所未有的迅猛之势蓬勃发展&#xff0c;海量的物联网终端与应用纷纷接入&#xff0c;这不可避免地引发了数据与应用层面的异构化难题&#xff0c;进而形成了复杂且多变的碎片化问题。物联网感知数据因其具备多源异构的显著特性&am…