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

SpringBoot入门详解

目录

因何而生的SpringBoot

单体架构的捉襟见肘

SpringBoot的优点

快速入门

高曝光率的Annotation

SpringBoot的工作机制

了解@SpringBootApplication

@SpringBootConfiguration

@EnableAutoConfiguration

自动配置的幕后英雄:SpringFactoriesLoader

@ComponentScan

SpringApplication执行流程

SpringApplicationRunListener

ApplicationContextInitializer

ApplicationListener

CommandLineRunner


因何而生的SpringBoot

单体架构的捉襟见肘

微服务架构和Spring Boot框架的出现是为了解决传统单体应用程序在开发、部署和维护方面遇到的一系列问题,包括:

  1. 复杂性管理: 传统的单体应用程序通常变得非常庞大和复杂,开发和维护成本逐渐增加。微服务架构将应用程序拆分成小的、独立的服务,每个服务负责特定的业务功能。这简化了应用的开发、测试和维护。

  2. 技术多样性: 单体应用程序通常使用单一的技术栈,而微服务允许每个服务选择适合其需求的技术栈。这使得开发者可以更好地选择适合任务的工具和技术。

  3. 快速交付: 微服务允许不同的团队独立开发、测试和部署服务,从而提高了交付速度。这有助于敏捷开发和持续交付。

  4. 可伸缩性: 微服务使得应用程序的各个部分可以根据需求独立地扩展,而不是整个应用程序。这提高了应用程序的可伸缩性,能够应对高流量和负载。

  5. 容错性: 微服务的分布性使得应用程序更容易实现容错和恢复能力。当某个服务失败时,不会影响整个应用程序。

  6. 部署灵活性: 微服务可以独立部署,这意味着你可以频繁地更新和部署单个服务,而不必影响整个应用程序。

Spring Boot的出现与微服务架构有关,它是Spring Framework的一部分,旨在简化开发独立的、可执行的Java应用程序。Spring Boot解决了传统Java应用程序开发中的繁琐配置问题,使开发人员能够更快速地构建微服务和独立应用程序。

SpringBoot的优点

Spring Boot是一个用于构建生产级Spring应用程序的框架,它具有许多优点,使得它成为Java应用程序开发的首选框架之一:

  1. 简化开发: Spring Boot通过自动配置和约定大于配置的原则,简化了应用程序的开发和配置。开发者可以快速启动项目,减少了大量的样板代码编写。

  2. 内嵌容器: Spring Boot支持内嵌的Web容器(如Tomcat、Jetty、Undertow),这意味着你无需手动部署WAR文件到独立的Servlet容器中,而是将应用程序打包成一个可执行的JAR文件,直接运行。

  3. 自动配置: Spring Boot根据你的项目的依赖和设置,自动配置应用程序的各个组件,包括数据源、Spring MVC、安全等。这减少了繁琐的配置工作。

  4. 开发工具: Spring Boot提供了许多开发者友好的工具,如Spring Boot DevTools,它可以自动重启应用程序、热部署等,大大提高了开发效率。

  5. 生产就绪: Spring Boot提供了一组用于监控、度量、健康检查、日志记录和安全的功能,使应用程序更容易部署和运行在生产环境中。

  6. 微服务支持: Spring Boot与Spring Cloud集成良好,支持构建微服务架构。它提供了RESTful服务的构建和调用、服务注册与发现、负载均衡等功能。

  7. 生态系统: Spring Boot建立在Spring框架的基础上,继承了Spring的强大生态系统,包括Spring Security、Spring Data、Spring Integration等。你可以轻松整合这些组件。

  8. 广泛的第三方库支持: Spring Boot支持许多第三方库和插件,包括Thymeleaf、Freemarker、Swagger、Spring Boot Actuator等,帮助你快速构建各种类型的应用。

  9. 可扩展性: Spring Boot是高度可定制和可扩展的,允许你根据项目需求进行自定义配置和功能扩展。

  10. 大量文档和社区支持: Spring Boot拥有丰富的官方文档和庞大的开发者社区,可以轻松找到答案和解决问题。

快速入门

如果要快速入门,这个传送门一定很有帮助------->Spring | Quickstart

高曝光率的Annotation
  1. @Configuration

    用于标识一个类作为配置类。配置类通常用于定义 Spring 容器的配置信息,包括 bean 的定义、依赖注入、AOP 配置等。使用 @Configuration 注解的类可以替代传统的 XML 配置文件,使配置更加可维护和类型安全。

  2. @ComponentScan

    对应XML配置形式中的<context:component-scan>元素,用于配合一些元信息Java Annotation,比如@Component和@Repository等,将标注了这些元信息Annotation的bean定义类批量采集到Spring的IoC容器中。

    不指定basePackages属性的时候,默认从声明@ComponentScan所在类的package扫描。

  3. @PropertySource和@PropertySources

    @PropertySource用于从某些地方加载*.properties文件内容。@PropertySources用于java8以下版本

    @Configuration
    @PropertySource{*classpath:1.properties}
    @PropertySource{*classpath:2.properties}
    public class XConfiguration {...
    }

    属性的覆盖和优先级取决于加载的顺序,通常有以下规则:

    1. 属性值加载的顺序:

      • 默认属性值:Spring 提供了一些默认属性,如 spring.datasource.url,这些属性在 Spring 启动时被加载。

      • 属性文件:使用 @PropertySource 注解加载的属性文件。

      • XML 配置文件:通过 XML 配置文件(如 applicationContext.xml)中的 <context:property-placeholder> 来加载属性文件。

      • 命令行参数和环境变量:命令行参数和环境变量可以覆盖已加载的属性值。

      • Java 系统属性:使用 System.setProperty() 来设置属性。

    2. 属性的优先级:

      • 当多个属性源中存在相同的属性时,后加载的属性会覆盖先加载的属性。

      • 属性的优先级从高到低为:命令行参数和环境变量 > XML 配置文件 > 属性文件 > 默认属性值。

  4. @Import与@ImportResource

    @Import:

    • @Import 注解用于导入其他配置类(@Configuration 注解标记的类)。

    • 可以在一个配置类中使用 @Import 注解导入多个其他配置类,以将它们组合在一起。

    @Configuration
    @Import({AppConfig1.class, AppConfig2.class})
    public class MainConfig {// ...
    }

    @ImportResource

    • @ImportResource 注解用于导入 XML 配置文件,通常是传统的 Spring XML 配置文件。

    • 通过 @ImportResource 注解,可以将一个或多个 XML 配置文件导入到 Spring 的注解配置中。

    @Configuration
    @ImportResource("classpath:applicationContext.xml")
    public class MainConfig {// ...
    }

SpringBoot的工作机制

SoringBoot是Spring框架对“约定优先于配置(Convention Over Configuration)”理念的最佳实践的产物。

了解@SpringBootApplication

从SpringBoot的quickStart教程中,看到SpringBoot启动类就只有以下几行:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

而其中的@SpringBootApplication和SpringApplication.run()两位就是重点关注对象了。

@SpringBootApplication实际上是一个符合Annotation,主要是下面这三位:

  • @SpringBootConfiguration

  • @EnableAutoConfiguration

  • @ComponentScan

而为了图方便,就把这3个Annotation合成了一个@SpringBootApplication。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}
), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {...
}
@SpringBootConfiguration

启动类标注了@Configuration注解,本质上就是一个IoC容器的配置类。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {...
}
@EnableAutoConfiguration

按照Spring的套路,@EnableXXXXX的Annotation都是借助@Import的支持干大事,@EnableAutoConfiguration干的就是借助@Import将所有符合自动配置条件的bean定义加载到IoC容器。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {...
}

其中最关键的就是@Import({AutoConfigurationImportSelector.class}),借助AutoConfigurationImportSelector,@EnableAutoConfiguration可以将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。而在Spring框架中SpringFactoriesLoader的支持下,@EnableAutoConfiguration可以“智能”地自动配置。

自动配置的幕后英雄:SpringFactoriesLoader

SpringFactoriesLoader 是 Spring Framework 中的一个工具类,它用于加载和管理以工厂方式提供的实现。它的主要作用是在 Spring 扩展机制、自动配置以及服务发现等场景中方便地加载和实例化实现类。通常,它是通过读取 META-INF/spring.factories 文件来完成这些任务的。

spring.factories是典型的java properties文件,配置的格式为key=value,注意key和value都是Java类型的完整类型,比如:

org.springframework.context.ApplicationContextInitializer=\
com.elaine.config.MyApplicationContextInitializer

这样一来,@EnableAutoConfiguration自动配置的就变成了:

从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射实例化为对应的标注了@Configuration形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。

@ComponentScan

@ComponentScan的功能是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。如果当前SpringBoot不需要加载bean定义的化,也可以不要@ComponentScan。

SpringApplication执行流程
  1. 在使用SpringApplication的静态run方法之前,我们需要创建一个SpringApplication对象。在SpringApplication实例初始化的时候,它会提前做好几件事:

    • 根据classpath里面是否存在特征类(org.springframework.web.context.ConfigurableWebApplicationContext)决定是创建一个Web应用使用的ApplicationContext类型,还是创建一个标准的Standalone应用使用的ApplicationContext类型。

    • 使用SpringFactoriesLoader在classpath中查找并加载所有可用的ApplicationContextInitializer。

    • 使用SpringFactoriesLoader在classpath中查找并加载所有可用的ApplicationListener。

    • 推断并设置main方法的定义类。

  2. 实例初始化完成且设置完成,执行run方法,遍历执行所有通过SpringFactoriesLoader可以找到并加载的SpringApplicationRunListener,调用它们的started()方法。

  3. 创建并配置SpringBoot应用将要使用的Environment(包括配置要是用的PropertySource和Profile)。

  4. 遍历所用的SpringApplicationRunListener的environmentPrepared()。

  5. SpringApplication打印banner(如果showBanner属性被设置为true)。

  6. 根据用户的个性化设置决定是否需要使用自定义的配置,最重要的,将之前准备好的environment配置给ApplicationContext使用。

  7. ApplicationContext创建完成,SpringApplication再次使用SpringFactoriesLoader,查找加载所用可用的ApplicationContextInitializer,遍历调用它们的initialize(applicationContext)方法对已经创建好的ApplicationContext进一步处理。

  8. 遍历所用的SpringApplicationRunListener的contextPrepared()方法。

  9. 最核心的一步,将@EnableAutoConfiguration获取的所用配置和其他形式的IoC配置加载到已经准备完毕的ApplicationContext。

  10. 遍历所用的SpringApplicationRunListener的contextLoaded()方法。

  11. 调用ApplicationContext的refresh()方法。

  12. 查找ApplicationContext中是否注册有CommandLineRunner,有则遍历执行它们。

  13. 遍历执行SpringApplicationRunListener的finished()方法。

整个过程中充斥着各种扩展点进行推进工作,我们有必要进一步分析下。

SpringApplicationRunListener

SpringApplicationRunListener是整个启动流程中接收不同执行点事件通知的监听者:

public interface SpringApplicationRunListener {//刚执行run方法时void started();//环境建立好时候void environmentPrepared(ConfigurableEnvironment environment);//上下文建立好的时候void contextPrepared(ConfigurableApplicationContext context);//上下文载入配置时候void contextLoaded(ConfigurableApplicationContext context);//上下文刷新完成后,run方法执行完之前void finished(ConfigurableApplicationContext context, Throwable exception);
}
ApplicationContextInitializer
  • SpringApplication 提供了 addInitializers 方法,可以用于注册一个或多个 ApplicationContextInitializer 的实现类。

  • ApplicationContextInitializer 在 Spring Boot 启动过程中最早执行,它可以在应用程序上下文初始化前对应用程序的配置进行修改。

ApplicationListener
  • ApplicationListener 是 Spring Framework 的标准接口,用于监听应用程序事件。Spring Boot 通过该接口支持了各种应用程序生命周期事件。

  • ApplicationListener 在应用程序启动过程中可以监听各种事件,例如上下文刷新事件、应用程序已启动事件等,根据事件类型的不同,监听器会在不同的阶段执行。

CommandLineRunner
  • CommandLineRunner 是 Spring Boot 的一个接口,它定义了一个 run 方法,该方法在 Spring Boot 应用程序启动后执行。

  • CommandLineRunner 在应用程序启动完成后执行,通常用于执行应用程序启动后的一些初始化操作,如加载数据或执行特定任务。

相关文章:

SpringBoot入门详解

目录 因何而生的SpringBoot 单体架构的捉襟见肘 SpringBoot的优点 快速入门 高曝光率的Annotation SpringBoot的工作机制 了解SpringBootApplication SpringBootConfiguration EnableAutoConfiguration 自动配置的幕后英雄&#xff1a;SpringFactoriesLoader Compon…...

数据分析案例-基于snownlp模型的MatePad11产品用户评论情感分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

Leetcode刷题解析——904. 水果成篮

1. 题目链接&#xff1a;904. 水果成篮 2. 题目描述&#xff1a; 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主…...

Spring Boot RESTful API

学习到接口部分了&#xff0c;记录一下 关于restful api感觉这篇文章讲的十分详细且通俗易懂一文搞懂什么是RESTful API - 知乎 (zhihu.com) Spring Boot 提供的 spring-boot-starter-web 组件完全支持开发 RESTful API &#xff0c;提供了 GetMapping&#xff1a;处理get请求…...

k8s day04

昨日内容回顾: - configMap ---> cm 应用场景: 主要用于配置文件的持久化。 - secret 应用场景: 存储敏感数据&#xff0c;并非加密数据。 - pod探针&#xff08;probe&#xff09;: - livenessProbe: 健康检查探针&#x…...

ESP32-IPS彩屏ST7789-Arduino-简单驱动

目的&#xff1a; 使ESP32能够驱动点亮ST7789显示屏 前提条件&#xff1a; ESP32 ST7789 &#xff08;240 x240&#xff0c;IPS&#xff09; 杜邦线 Arduino 过程&#xff1a; 0x00--接线 0x01--驱动&#xff1a; 彩屏驱动库 针对不同的彩屏驱动芯片&#xff0c;常用的 Arduino…...

高效工具类软件使用

高效工具类软件使用 目录概述需求&#xff1a; 设计思路实现思路分析1.Leanote2.Obsidian 的使用 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for…...

批处理文件(.bat)中,dir与tree命令的效果

目录 dir命令 用法 操作 效果 dir /? dir dir D:\111\111_3 dir D:\111 *.mp4 dir D:\111 /ad dir D:\111 /ar dir D:\111 /s dir D:\111\111_3 >1bat.txt dir D:\111 >>1bat.txt tree命令 用法 操作 效果 tree /? tree tree D:\111\111_3 tree…...

STM32 ---- 再次学习STM32F103C8T6/STM32F409IGT6

目录 一、环境搭建及介绍 关于STM32基础介绍 新建工程 外设案例 LED流水灯 蜂鸣器 上拉电阻和下拉电阻知识 电压比较器 c语言基础知识 类型、结构体、枚举 类型int8_t int16_t int32_t 宏替换 #define 和typedef用法 结构体两种填充方法 和 命名规则 枚举用法 常用…...

UE4 EQS环境查询 学习笔记

EQS环境查询对应Actor的范围 EQS环境查询查询对应的类 查询到即有一个蓝色的球在Actor上&#xff0c;里面有位置信息等等 在行为树运行EQS&#xff0c;按键&#xff08;‘&#xff09;可以看到Player的位置已经被标记 运行对应的EQS在这里放如EQS就可以了 Generated Point&…...

计算机算法分析与设计(11)---贪心算法(活动安排问题和背包问题)

文章目录 一、贪心算法概述二、活动安排问题2.1 问题概述2.2 代码编写 三、背包问题3.1 问题描述3.2 代码编写 一、贪心算法概述 1. 贪心算法的定义&#xff1a;贪心算法是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以…...

shell命令以及运行原理

Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用kernel。 而是通过kernel的“外壳”程序&#xff0c;也就是所谓的shell&#xff0c;来与kernel沟通。如何理解&a…...

MySQL进阶(再论JDBC)——JDBC编程思想的分析 JDBC的规范架构 JDBC相关的类分析

前言 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的标准化语言&#xff0c;它用于定义、操作和管理数据库中的数据。SQL是一种通用的语言&#xff0c;可以用于多种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;如MySQ…...

rabbitMQ的知识点

RabbitMQ是一种消息队列软件&#xff0c;它实现了高度可靠的消息传递机制。RabbitMQ支持多种消息协议&#xff0c;包括AMQP、STOMP、MQTT等&#xff0c;比较灵活。以下是一些rabbitmq的知识点&#xff1a; 1. 消息队列&#xff1a;消息队列是一种分布式系统中广泛使用的通信模…...

​EtherNet/IP 库卡机器人和EtherCAT倍福PLC总线协议连接案例​

EtherNet/IP 是一种适合于工业环境和对时间要求比较苛刻的应用的网络。而远创智控YC-EIPM-ECT通讯网关&#xff0c;是一款自主研发的EtherNet/IP 从站功能的通讯网关。它不仅可以实现EtherNet/IP 和EtherCAT的无缝连接&#xff0c;还可以将EtherNet/IP 作为从站连接到EtherCAT总…...

微信小程序 uniapp+vue线上洗衣店业务管理系统演89iu2

本课题意在设计一种系统的、基于用户体验的线上洗衣服务模式&#xff0c;具有如下的研究意义: (1)为用户提供更简单、便捷的洗衣服务模式; (2)为智能柜的盈利模式提供了新的方向; (3)通过线上系统、智能柜与洗衣工厂结合的方式&#xff0c;为洗衣企业构建了一套节 省人力成本的…...

Maven项目,进行编译,使用idea的 编译功能,就是正常的,但是在终端中执行 mvn clean compile 报错

一、背景&#xff1a; Maven项目&#xff0c;进行编译&#xff0c;使用idea的 编译功能&#xff0c;就是正常的&#xff0c;但是在终端中执行 mvn clean compile 报错 报错信息&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin…...

mssql还原数据库失败

标题: Microsoft SQL Server Management Studio ------------------------------ 服务器 "192.168.31.132" 的 附加数据库 失败。 (Microsoft.SqlServer.Smo) 有关帮助信息&#xff0c;请单击: https://go.microsoft.com/fwlink?ProdNameMicrosoftSQLServer&…...

Linux多线程编程- 无名信号量

简介 无名信号量&#xff08;在 POSIX 环境下通常指 sem_t 类型的信号量&#xff09;是用于同步和互斥的原语&#xff0c;它允许线程和进程按照预期的顺序执行&#xff0c;并确保对共享资源的安全访问。无名信号量与命名信号量的主要区别在于它们的可见性和生命周期。无名信号…...

【网络协议】聊聊DHCP和PXE 工作原理

DHCP 动态主机配置协议 对于每个主机来说&#xff0c;只要连接了网络&#xff0c;那么就会配置一个IP地址&#xff0c;那么这个IP地址&#xff0c;如果是手动配置的话&#xff0c;对于公司内部的人员来说都要找IT进行配置&#xff0c;这个太浪费人力物力了&#xff0c;所以解决…...

发现国内优秀的团队协作软件,帮助提高工作效率

中国有许多优秀的团队协作软件&#xff0c;它们在企业和组织中发挥着重要作用。 以下是一些最受欢迎的团队协作软件&#xff1a; 1、钉钉&#xff08;DingTalk&#xff09;: 这是一款由阿里巴巴推出的企业级协作工具&#xff0c;旨在帮助企业和组织实现高效沟通和协作。钉钉提…...

LeetCode 面试题 08.12. 八皇后

文章目录 一、题目二、C# 题解 一、题目 设计一种算法&#xff0c;打印 N 皇后在 N N 棋盘上的各种摆法&#xff0c;其中每个皇后都不同行、不同列&#xff0c;也不在对角线上。这里的“对角线”指的是所有的对角线&#xff0c;不只是平分整个棋盘的那两条对角线。 注意&#…...

Excel 的下拉列表

可以将 Sheet6 隐藏&#xff0c;就更好地隐藏了来源。...

基于Effect的组件设计 | 京东云技术团队

Effect的概念起源 从输入输出的角度理解Effect https://link.excalidraw.com/p/readonly/KXAy7d2DlnkM8X1yps6L 编程中的Effect起源于函数式编程中纯函数的概念 纯函数是指在相同的输入下&#xff0c;总是产生相同的输出&#xff0c;并且没有任何副作用(side effect)的函数。…...

541. 反转字符串 II

541. 反转字符串 II class Solution { public:void Reverse(string& s, int start, int end){end--;while (start < end){swap(s[start], s[end]);start;end--;}}string reverseStr(string s, int k){int len s.size();for (int i 0; i < len; i 2 * k){if (i …...

基本分段存储管理方式(分段,段表,地址转换以及与分页管理对比)

1.分段 1.进程的地址空间: 按照程序自身的逻辑关系划分为若干个段&#xff0c;每个段都有一个段名 &#xff08;在低级语言中&#xff0c;程序员使用段名来编程&#xff09;&#xff0c;每段从0开始编址. 2.内存分配规则: 以段为单位进行分配&#xff0c;每个段在内存中占据…...

哪个牌子的洗地机好用?2023洗地机推荐

洗地机作为一款高效的清洁家电能轻松的搞定各种干湿垃圾&#xff0c;满足日常生活中的各种地面清洁需求&#xff0c;越来越受大众的青睐&#xff0c;那么我们如何快速的选择一款适合自己无线洗地机呢?一起来看看! 做推荐之前&#xff0c;先给大家科普选购洗地机的时候应该关注…...

根据脑图谱获取感兴趣区域的mask

根据脑图谱获取感兴趣区域的mask 1&#xff0c;引入1.1 ASPECT-Atlas 2&#xff0c;获取脑图谱感兴趣区域mask参考&#xff1a; 1&#xff0c;引入 脑影像分析中&#xff0c;我们常常会针对性的对某些感兴趣区域进行分析&#xff0c;而对它们进行分析的前提是获取该区域的mask…...

Android Framework通信:Handler

文章目录 前言一、Handler源码分析1、创建Handler2、发送消息3、取消息4、消息处理5、线程切换的方法&#xff08;Handler异步消息处理机制流程&#xff09;handler.sendMessage()handler.post()View.post()Activity中的runOnUiThread() 二、Handler高频面试题1、为什么要有Han…...

Redis的安装和配置

一、Redis的安装 使用命令将redis安装到linux服务器 yum -y install redis配置redis配置文件 redis的配置文件默认路径为/etc/redis.conf&#xff0c;对配置文件进行修改。 &#xff08;1&#xff09;注释掉bind 127.0.0.1&#xff1b; bind配置项设置的是redis允许的ip地址访问…...