Springboot+ElasticSearch构建博客检索系统-学习笔记01

news2025/2/26 22:11:49

课程简介:从实际需求分析开始,打造个人博客检索系统。内容涵盖:ES安装、ES基本概念和数据类型、Mysql到ES数据同步、SpringBoot操作ES。通过本课,让学员对ES有一个初步认识,理解ES的一些适用场景,以及如何使用springboot来同ES进行交互。


视频地址:

  1. Springboot + ElasticSearch 构建博客检索系统-慕课网

博客笔记:

  1. Springboot+ElasticSearch构建博客检索系统-学习笔记01
  2. Springboot+ElasticSearch构建博客检索系统-学习笔记02

参考笔记:

  1. ElasticSearch与Springboot结合入门学习_hyyyya的博客-CSDN博客
  2. GitHub - holic-x/springboot-es: 基于springboot-es的博客检索系统
  3. GitHub - gaohanghang/springboot-blog-es: Springboot + ElasticSearch 构建博客检索系统
  4. GitHub - Hyyellow/ElasticSearch_Demo: ES框架的初步尝试Demo

目录

第1章 课程介绍

视频:1-1 课程导学(08:33)

第2章 初识ElasticSearch

视频:2-1 ElasticSearch概念和适用场景(04:46)

视频:2-2 ElasticSearch数据类型和关系型数据库的对比(02:19)

视频:2-3 安装ES、postman、kibana(06:30)

视频:2-4 演示postman、kibana对ES的交互(11:46)

01、Postman的使用

02、kibana的DevTools使用

第3章 博客网站全文检索

视频:3-1 基于Mysql实现(07:29)

01、创建数据库数据表

02、测试sql查询语句

03、mysql检索数据原理分析

视频:3-2 基于ES实现(04:57)

第4章 Mysql、ES数据同步

视频:4-1 数据同步中间件(09:02)

视频:4-2 Logstash全量、增量同步解决方案(10:30)

01、下载并安装logstash

02、引入mysql连接jar包并配置mysql.conf文件

03、使用kibana进行数据连接测试

04、将mysql数据同步到es中

05、mysql.conf文件sql语句解析

第5章 SpringBoot集成ES

第6章 课程回顾与总结


第1章 课程介绍

视频:1-1 课程导学(08:33)

搜索“elasticsearch”时间对比:

  1. mysql:3004ms
  2. elasticsearch:7ms

思维导图-开发技术栈:

第2章 初识ElasticSearch

视频:2-1 ElasticSearch概念和适用场景(04:46)

 

  1. 分布式:单点或多节点集群运行,node节点、cluster集群;
  2. 全文检索:标题+内容;
  3. 实时快速:速度快;
  4. Restful:接口。

视频:2-2 ElasticSearch数据类型和关系型数据库的对比(02:19)

es官方:在一个index中尽量保持一个type。

  1. index:数据库;
  2. type:数据表;
  3. document:一行一行的数据;
  4. field:字段;
  5. mapping:数据字段定义。

视频:2-3 安装ES、postman、kibana(06:30)

es由java实现,es版本6.3.2、jdk1.8。

  1. 免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic
  2. Elasticsearch:官方分布式搜索和分析引擎 | Elastic

 

kibana:开源的分析与可视化(图表、饼图)平台,用于与es协同工作。


kibana下载地址:Download Kibana Free | Get Started Now | Elastic


 

视频:2-4 演示postman、kibana对ES的交互(11:46)

01、Postman的使用

 

  1. GET:获取数据
  2. PUT:创建索引
  3. DEL:删除索引
  4. POST:修改数据
localhost:9200/_all
localhost:9200/test

localhost:9200/person/_doc/1
{
    "first_name": "John",
    "last_name": "Smith",
    "age": 25,
    "about": "I love to go rock climbing.",
    "interests": ["sports", "music"]
}

localhost:9200/person/_doc/2
{
    "first_name": "Eric",
    "last_name": "Smith",
    "age": 23,
    "about": "I love basketball.",
    "interests": ["sports", "reading"]
}

localhost:9200/person/_doc/_search?q=first_name:john

02、kibana的DevTools使用

使用kibana的Dev Tools发送结构化的查询语句,来同ES进行简单的交互。

告诉es使用者要查询的索引之后,用“_type”标识默认的唯一的type;在es6.0版本之后,官方推荐一个索引一个type,推荐不写type。

GET _all
GET /person/_doc/1

POST /person/_search
{
  "query": {
    "bool": {
      "should": [ //should:应该做什么事情
        {
          "match": { //match:匹配
            "first_name": "Eric" //"last_name": "Smith"
          }
        }
      ]
    }
  }
}

POST /person/_search
{
  "query": {
    "bool": {
      "should": [ // must:必须
        {
          "match": {
            "last_name": "Smith"
          }
        },
        {
          "match": {
            "about": "basketball"
          }
        }
      ]
    }
  }
}

第3章 博客网站全文检索

视频:3-1 基于Mysql实现(07:29)

01、创建数据库数据表

/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50557
Source Host           : localhost:3306
Source Database       : blog

Target Server Type    : MYSQL
Target Server Version : 50557
File Encoding         : 65001

*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for t_blog
-- ----------------------------
DROP TABLE IF EXISTS `t_blog`;
CREATE TABLE `t_blog` (
  `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `title` VARCHAR(60) DEFAULT NULL COMMENT '博客标题',
  `author` VARCHAR(60) DEFAULT NULL COMMENT '博客作者',
  `content` MEDIUMTEXT COMMENT '博客内容',
  `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
  `update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of t_blog
-- ----------------------------
INSERT INTO `t_blog` VALUES ('1', 'Springboot 为什么这', 'noob', '没错 Springboot ', '2019-12-08 01:44:29', '2019-12-08 01:44:34');
INSERT INTO `t_blog` VALUES ('3', 'Springboot 中 Redis', 'noob', 'Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elasticsearch, Solr和Cassandra。\\n\\n使用Redis\\nRedis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。\\n\\nRedis官网\\nRedis中文社区\\n引入依赖\\nSpring Boot提供的数据访问框架Spring Data Redis基于Jedis。可以通过引入spring-boot-starter-redis来配置依赖关系。\\n\\n\\n org.springframework.boot\\n spring-boot-starter-redis\\n\\n注意不同版本的spring boot下,redis的starter依赖名略有不同,如果上面的不行,可以尝试spring-boot-starter-data-redis\\n\\n参数配置\\n按照惯例在application.properties中加入Redis服务端的相关配置,具体说明如下:\\n\\n# REDIS (RedisProperties)\\n# Redis数据库索引(默认为0)\\nspring.redis.database=0\\n# Redis服务器地址\\nspring.redis.host=localhost\\n# Redis服务器连接端口\\nspring.redis.port=6379\\n# Redis服务器连接密码(默认为空)\\nspring.redis.password=\\n# 连接池最大连接数(使用负值表示没有限制)\\nspring.redis.pool.max-active=8\\n# 连接池最大阻塞等待时间(使用负值表示没有限制)\\nspring.redis.pool.max-wait=-1\\n# 连接池中的最大空闲连接\\nspring.redis.pool.max-idle=8\\n# 连接池中的最小空闲连接\\nspring.redis.pool.min-idle=0\\n# 连接超时时间(毫秒)\\nspring.redis.timeout=0\\n其中spring.redis.database的配置通常使用0即可,Redis在配置的时候可以设置数据库数量,默认为16,可以理解为数据库的schema\\n\\n测试访问\\n通过编写测试用例,举例说明如何访问Redis。\\n\\n@RunWith(SpringJUnit4ClassRunner.class)\\n@SpringApplicationConfiguration(Application.class)\\npublic class ApplicationTests {\\n\\n @Autowired\\n private StringRedisTemplate stringRedisTemplate;\\n\\n @Test\\n public void test() throws Exception {\\n\\n // 保存字符串\\n stringRedisTemplate.opsForValue().set(\"aaa\", \"111\");\\n Assert.assertEquals(\"111\", stringRedisTemplate.opsForValue().get(\"aaa\"));\\n\\n }\\n\\n}\\n通过上面这段极为简单的测试案例演示了如何通过自动配置的StringRedisTemplate对象进行Redis的读写操作,该对象从命名中就可注意到支持的是String类型。如果有使用过spring-data-redis的开发者一定熟悉RedisTemplate<K, V>接口,StringRedisTemplate就相当于RedisTemplate<String, String>的实现。\\n\\n除了String类型,实战中我们还经常会在Redis中存储对象,这时候我们就会想是否可以使用类似RedisTemplate<String, User>来初始化并进行操作。但是Spring Boot并不支持直接使用,需要我们自己实现RedisSerializer接口来对传入对象进行序列化和反序列化,下面我们通过一个实例来完成对象的读写操作。\\n\\n创建要存储的对象:User\\npublic class User implements Serializable {\\n\\n private static final long serialVersionUID = -1L;\\n\\n private String username;\\n private Integer age;\\n\\n public User(String username, Integer age) {\\n this.username = username;\\n this.age = age;\\n }\\n\\n // 省略getter和setter\\n\\n}\\n实现对象的序列化接口\\n\\npublic class RedisObjectSerializer implements RedisSerializer {\\n\\n private Converter<Object, byte[]> serializer = new SerializingConverter();\\n private Converter<byte[], Object> deserializer = new DeserializingConverter();\\n\\n static final byte[] EMPTY_ARRAY = new byte[0];\\n\\n public Object deserialize(byte[] bytes) {\\n if (isEmpty(bytes)) {\\n return null;\\n }\\n\\n try {\\n return deserializer.convert(bytes);\\n } catch (Exception ex) {\\n throw new SerializationException(\"Cannot deserialize\", ex);\\n }\\n }\\n\\n public byte[] serialize(Object object) {\\n if (object == null) {\\n return EMPTY_ARRAY;\\n }\\n\\n try {\\n return serializer.convert(object);\\n } catch (Exception ex) {\\n return EMPTY_ARRAY;\\n }\\n }\\n\\n private boolean isEmpty(byte[] data) {\\n return (data == null || data.length == 0);\\n }\\n}\\n配置针对User的RedisTemplate实例\\n\\n@Configuration\\npublic class RedisConfig {\\n\\n @Bean\\n JedisConnectionFactory jedisConnectionFactory() {\\n return new JedisConnectionFactory();\\n }\\n\\n @Bean\\n public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory factory) {\\n RedisTemplate<String, User> template = new RedisTemplate<String, User>();\\n template.setConnectionFactory(jedisConnectionFactory());\\n template.setKeySerializer(new StringRedisSerializer());\\n template.setValueSerializer(new RedisObjectSerializer());\\n return template;\\n }\\n\\n\\n}\\n完成了配置工作后,编写测试用例实验效果\\n\\n@RunWith(SpringJUnit4ClassRunner.class)\\n@SpringApplicationConfiguration(Application.class)\\npublic class ApplicationTests {\\n\\n @Autowired\\n private RedisTemplate<String, User> redisTemplate;\\n\\n @Test\\n public void test() throws Exception {\\n\\n // 保存对象\\n User user = new User(\"超人\", 20);\\n redisTemplate.opsForValue().set(user.getUsername(), user);\\n\\n user = new User(\"蝙蝠侠\", 30);\\n redisTemplate.opsForValue().set(user.getUsername(), user);\\n\\n user = new User(\"蜘蛛侠\", 40);\\n redisTemplate.opsForValue().set(user.getUsername(), user);\\n\\n Assert.assertEquals(20, redisTemplate.opsForValue().get(\"超人\").getAge().longValue());\\n Assert.assertEquals(30, redisTemplate.opsForValue().get(\"蝙蝠侠\").getAge().longValue());\\n Assert.assertEquals(40, redisTemplate.opsForValue().get(\"蜘蛛侠\").getAge().longValue());\\n\\n }\\n\\n}\\n当然spring-data-redis中提供的数据操作远不止这些,本文仅作为在Spring Boot中使用redis时的配置参考,更多对于redis的操作使用,请参考Spring-data-redis Reference。\\n\\n代码示例\\n本文的相关例子可以查看下面仓库中的chapter3-2-5目录:\\n\\nGithub:https://github.com/dyc87112/SpringBoot-Learning\\nGitee:https://gitee.com/didispace/SpringBoot-Learning\\n如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!', '2019-12-08 01:44:29', '2019-12-08 01:44:29');
INSERT INTO `t_blog` VALUES ('4', 'Springboot 中如何优化', 'noob', NULL, '2019-12-08 01:44:29', '2019-12-08 01:44:29');
INSERT INTO `t_blog` VALUES ('5', 'Springboot 消息队列', 'noob', NULL, '2019-12-08 01:44:29', '2019-12-08 01:44:29');
INSERT INTO `t_blog` VALUES ('6', 'Docker Compose + Springboot', 'noob', NULL, '2019-12-08 01:44:29', '2019-12-08 01:44:29');
INSERT INTO `t_blog` VALUES ('7', 'hello es', 'noob', 'hello es', '2019-12-08 01:44:29', '2019-12-08 01:44:29');

02、测试sql查询语句

SELECT * FROM t_blog WHERE title LIKE "%spring%" OR content LIKE "%spring%";

03、mysql检索数据原理分析

视频:3-2 基于ES实现(04:57)

第4章 Mysql、ES数据同步

视频:4-1 数据同步中间件(09:02)

 

 

 

es官方的数据收集及同步组件:logstash。

  1. logstash就像一个管道,一头连接着数据源,一头连接着es。
  2. logstash的输入数据源有很多,log4j日志文件。
  3. logstash-jdbc用于对接mysql这一类的数据源,实现要求:id对应es中的_id;mysql表中需要有标识创建数据或更新数据时间的字段time,通过与时间的比较完成增量的同步。

视频:4-2 Logstash全量、增量同步解决方案(10:30)

01、下载并安装logstash

logstash下载地址

  1. Logstash:收集、解析和转换日志 | Elastic
  2. Logstash 6.3.2 | Elastic

02、引入mysql连接jar包并配置mysql.conf文件

 

input {
    jdbc {
        # 指定jdbc驱动包位置(不同版本处理不同,此处可直接将mysql驱动包放置logstash-core/lib/jars下,无需配置jdbc_driver_library)
		# "C:\\logstash-6.3.2\\mysql-connector-java-5.1.31.jar" /xxx/logstash-7.5.0/mysql-connector-java-5.1.31.jar
        jdbc_driver_library => "F:\\logstash\\logstash-6.3.2\\mysql-connector-java-5.1.31.jar"
        # 要使用的驱动包类,有过java开发经验的应该很熟悉这个了,不同的数据库调用的类不一样。
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        # mysql数据库的连接信息
        jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/blog"
        # mysql用户
        jdbc_user => "root"
        # mysql密码
        jdbc_password => "root"
        # 定时任务,多久执行一次查询,默认一分钟,如果想要没有延迟,可以使用 schedule => "* * * * * *"
        # 定时任务,默认一分钟,"* * * * *"代表设置为无延迟
        schedule => "* * * * *"
        # *清空存储在logstash的上一次的sql_last_value记录*
        clean_run => true
        # 要执行的语句
        statement => "select * FROM t_blog WHERE update_time > :sql_last_value AND update_time < NOW() ORDER BY update_time desc"
    }
}

output {
    elasticsearch {
		# es host : port
        hosts => ["127.0.0.1:9200"]
        # 索引
        index => "blog"
        # _id (取到mysql数据库记录的id)
        document_id => "%{id}"
    }
}

03、使用kibana进行数据连接测试

注意:kibana数据从Elasticsearch而来,在启动kibana需要先启动Elasticsearch。

启动kibana步骤:

  1. 先启动elasticsearch:F:\elasticSearch\elasticsearch-6.3.2\bin\elasticsearch.bat
  2. 再启动kibana:F:\elasticSearch\kibana-6.3.2-windows-x86_64\bin\kibana.bat

04、将mysql数据同步到es中

logstash -f ../config/mysql.conf

  1. -f:指定自己设置的配置文件
  2. config/mysql.conf:配置文件存储位置

使用kibana开发工具查看mysql数据是否成功同步到es中:

GET /blog/_stats

POST /blog/_search
{
}

05、mysql.conf文件sql语句解析

  1. Select * from t_blog where update_time >:sql_last_value order by update_time DESC;
  2. R12、R22等临界点数据始终不会被扫描到,始终不会被同步到es中。
  3. Select * from t_blog where update_time >=:sql_last_value order by update_time DESC;
  4. 为了使R12、R22等临界点数据被扫描到,被同步到es中。
  5. Select * from t_blog where update_time >:sql_last_value and update_time < NOW() order by update_time DESC;

 

 

第5章 SpringBoot集成ES

Springboot+ElasticSearch构建博客检索系统-学习笔记02

视频:5-1 分词器介绍(01:40)
视频:5-2 IK分词器的安装和使用(11:50)
视频:5-3 springboot项目搭建(08:45)
视频:5-4 项目结构和JPA演示(10:03)
视频:5-5 Springboot集成ES(11:59)
视频:5-6 项目后端REST API实现(17:07)
视频:5-7 项目前端VUE视图渲染(21:49)

第6章 课程回顾与总结

Springboot+ElasticSearch构建博客检索系统-学习笔记02

视频:6-1 课程回顾与总结(05:04)

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

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

相关文章

C语言实例|编写C程序在控制台打印余弦曲线

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…

30岁了,说几句大实话

是的&#xff0c;我 30 岁了&#xff0c;还是周岁。 就在这上个月末&#xff0c;我度过了自己 30 岁的生日。 都说三十而立&#xff0c;要对自己有一个正确的认识&#xff0c;明确自己以后想做什么&#xff0c;能做什么。 想想时间&#xff0c;过得真快。 过五关斩六将&…

基于圆展开自适应三边测量算法的室内定位

基于圆展开自适应三边测量算法的室内定位 具有无线通信功能的移动设备的日益普及刺激了室内定位服务的增长。室内定位用于实时定位设备位置&#xff0c;方便访问。然而&#xff0c;由于大量障碍物&#xff0c;与室外定位相比&#xff0c;室内定位具有挑战性。全球定位系统非常适…

【MyBatis】| MyBatis分页插件PageHelper

目录 一&#xff1a;MyBatis使⽤PageHelper 1. limit分⻚ 2. PageHelper插件 一&#xff1a;MyBatis使⽤PageHelper 1. limit分⻚ &#xff08;1&#xff09;概念&#xff1a; ①页码&#xff1a;pageNum&#xff08;用户会发送请求&#xff0c;携带页码pageNum给服务器&am…

Pom.xml详解

目录 1、Maven的下载安装 2、什么是pom&#xff1f; 3、较完整的pom元素 4、默认生成Maven工程的pom内容 5、自定义的属性变量 6、依赖管理 6.1、整体依赖关系列表 6.2、依赖关系的传递性 6.3、依赖传递可能造成的问题 6.3.1、scope依赖范围 6.3.2、依赖调节 6.3.3…

【分享】如何通过集简云将ChatGPT人工智能接入到我们的飞书机器人中?

ChatGPT是一款非常强大的人工智能产品&#xff0c;可以有创造性的回复和创作文字&#xff0c;图片&#xff0c;适用于很多办公场景。这篇文章将介绍如何将ChatGPT接入到我们的飞书机器人中。 在集简云中的ChatGPT应用 目前集简云提供了两个ChatGPT应用: OpenAI(ChatGPT&#x…

EdgeCOM嵌入式边缘计算机的参数配置

EdgeCOM嵌入式边缘计算机的参数配置&#xff1a; 下面以 eth0 为例进行命令说明。 在 Linux 系统下&#xff0c;使用 ifconfig 命令可以显示或配置网络设备&#xff0c;使用 ethtool 查询及 设置网卡参数。 设置 IP 地址&#xff0c;查看当前网卡详情&#xff1a; rootfl-imx6u…

数字源表在二极管特性参数分析中的应用

分立器件特性参数测试是对待测器件&#xff08;DUT&#xff09;施加电压或电流&#xff0c;然后测试其对激励做出的响应&#xff0c;通常分立器件特性参数测试需要几台仪器完成&#xff0c;如数字万用表、 电压源、电流源等。然而由数台仪器组成的系统需要分别进行编程、同步、…

ShardingSphere-Proxy5 根据时间分表

0、软件版本 ShardingSphere-Proxy&#xff1a; 5.2.0 MySQL&#xff1a; 8.0.30 系统&#xff1a; win10 1、ShardingSphere-Proxy下载 我们可以在 官网 找到最新版ShardingSphere-Proxy下载&#xff0c;也可以在ShardingSphere仓库中下载 2、ShardingSphere-Proxy配置 …

MySQL存储引擎、事务、索引 | 老杜

目录 一、存储引擎 1、什么是存储引擎 2、怎么设存储引擎 3、常用存储引擎 MyISAM存储引擎 InnoDB存储引擎 MEMORY存储引擎 二、事务 1、什么是事务 2、怎么做到同时成功同时失败 3、怎么提交和回滚呢 4、事务4个特性 A&#xff1a;原子性 C&#xff1a;一致性 …

适用于媒体行业的管理数据解决方案—— StorageGRID Webscale

主要优势 1、降低媒体存储库的复杂性 • 借助真正的全局命名空间在全球范围内存储数据并在本地进行访问。 • 实施纠删编码和远程复制策略。 • 通过单一管理平台管理策略和监控存储。 2、优化媒体工作流 • 确认内容在合适的时间处于合适的位置。 • 支持应用程序直接通过 A…

研报精选230215

目录 【行业230215开源证券】电力设备行业投资策略&#xff1a;特高压建设有望迎来高峰期&#xff0c;解决清洁能源跨区互济瓶颈【行业230215浙商证券】计算机行业【AIGC算力时代系列报告】&#xff1a;ChatGPT研究框架【个股230215国信证券_公牛集团】民用电工行业领军者&…

SpringBoot08:Shiro

什么是Shiro&#xff1f; 一个Java的安全&#xff08;权限&#xff09;框架&#xff0c;可以完成认证、授权、加密、会话管理、Web集成、缓存等 下载地址&#xff1a;Apache Shiro | Simple. Java. Security. 快速启动 先在官网找到入门案例&#xff1a;shiro/samples/quick…

leaflet 鼠标点击弹出popup,显示明星名片(068)

第068个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中显示名人信息,这里给marker绑定popup,同时给每一个icon设定不同的图片。bindPopup(popup) 开始时不显示弹出框。而bindPopup(popup) .openOn(this.map); 开始时候会弹出一个pop 直接复制下面的 vue+leaf…

不可错过的SQL优化干货分享-sql优化、索引使用

本文是向大家介绍在sql调优的几个操作步骤&#xff0c;它能够在日常遇到慢sql时有分析优化思路&#xff0c;能够让开发者更好的了解sql执行的顺序和原理。一、前言在日常开发中&#xff0c;我们经常遇到一些数据库相关的问题&#xff0c;比方说&#xff1a;SQL已经走了索引了&a…

java的双亲委派模型-附源码分析

1、类加载器 1.1 类加载的概念 要了解双亲委派模型&#xff0c;首先我们需要知道java的类加载器。所谓类加载器就是通过一个类的全限定名来获取描述此类的二进制字节流&#xff0c;然后把这个字节流加载到虚拟机中&#xff0c;获取响应的java.lang.Class类的一个实例。我们把实…

边界层气象学期末复习笔记

边界层气象学期末复习笔记 什么是边界层 广义上的边界层是&#xff1a;气体流动于平板上方&#xff0c;平板表面的摩擦力和垂直速度切变产生的流体内摩擦力阻滞了固体边界处的气体流动&#xff0c;这样一个流速减少&#xff0c;并低于自由气流速度的区域称为边界层 在厚度较少…

uniapp ios证书申请和上架全流程

目前市场上流行着很多多端开发框架&#xff0c;就拿uniapp和react native来比较&#xff0c;uniapp比react native方便很多&#xff0c;react的编译还需要mac电脑&#xff0c;而uniapp则轻量得多&#xff0c;一台windows电脑就可以打包所有端的应用&#xff0c;包括ios版本。 …

nginx隐藏服务器信息以及修改服务器名称

网络安全日益受到关注。尽可能的隐藏信息,是公认的较为安全的做法。 nginx在默认情况下会输出服务软件名+版本号。 在nginx配置文件中添加如下: server_tokens off; 此项设置,可以屏蔽nginx输出版本号。 类似输出如下图: 由上图可见,仅输出了nginx名称。 如果想要修…

SAP S/4HANA 概述

智能企业业务技术平台Business Technology Platform提供数据管理和分析&#xff0c;并支持应用程序开发和集成。它还允许我们的客户使用人工智能、机器学习和物联网等智能技术来推动创新。业务网络Business network帮助客户实现跨公司业务流程的数字化。该网络建立在我们的采购…