JavaEE高阶---SpringBoot的创建和使用

news2025/7/23 23:51:55

一 : 什么是SpringBoot?

Spring的诞生是为了简化 Java 程序的开发的,Spring Boot 的诞生是为了简化 Spring 程序开发的.

Spring Boot 是所有基于 Spring 开发的项目的起点 . Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件 . Spring Boot是在Spring的基础上面搭设的框架,目的是为了简化Spring项目的搭设和开发过程 .

在这里插入图片描述

二 : SpringBoot的优点

  • 快速集成框架,Spring Boot 提供了启动添加依赖的功能, 于秒级集成各种框架 ;
  • 内置运算容器, 需配置 Tomcat 等 Web 容器,直接运行和部署程序 ;
  • 快速部署项目,⽆需外部容器即可启动并运⾏项⽬ ;
  • 可以完全抛弃繁琐的 XML,使用注解和配置的⽅式进⾏开发 ;
  • ⽀持更多的监控的指标,可以更好的了解项⽬的运⾏情况 .

三 : SpringBoot项目的创建

3.1 使用IDEA创建

Step1:安装 Spring Boot Helper 插件.

在这里插入图片描述

Step2:新建一个Spring Boot项目.

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发 . 通过添加注解的方式,不需要为类编写getter或equals方法,同时可以自动化日志变量 .

  2. spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用 .

  3. spring web 包含web应用开发时,用到spring框架时所需的核心类,包括自动载入webapplicationcontext特性的类、struts与jsf集成类、文件上传的支持类、filter类和大量工具辅助类 .

这是整体的项目结构 :

在这里插入图片描述

Step3:编写代码

新建TestController类并编写代码 :

在这里插入图片描述

添加maven框架支持 :

在这里插入图片描述
在这里插入图片描述

Step4:删除掉无用的maven插件文件.

在这里插入图片描述
在这里插入图片描述

Step5:运行项目,检验结果正确性

在这里插入图片描述

可以手动修改端口号 :

在这里插入图片描述

3.2 使用网页版创建

Step1:直接新建一个Spring Boot项目.

在这里插入图片描述
在这里插入图片描述
会得到一个压缩包 :

在这里插入图片描述

Step2:解压文件,放置在你需要放置的目录下,并使用IDEA打开项目.

这里我放在C盘下. (顺便改了个名)

在这里插入图片描述
在这里插入图片描述

Step3:删除无用的maven插件文件并编写代码[参考3.1]

在这里插入图片描述

Step4:运行项目,检验结果正确性

在这里插入图片描述
成功 !!!

Spring中Boot有一个核心的要点 : 约定大于配置 !

比如 , 如果我们希望TestController能够被项目识别到 , 它必须和Demo1Application放在同一目录下 .

其中 , Demo1Application含有注解@SpringBootApplication .

在这里插入图片描述

在这里插入图片描述

再比如 , 如果希望配置文件生效 , 配置文件必须以application开头 .

在这里插入图片描述

四 : SpringBoot的配置文件

4.1 配置文件作用

整个项目中所有重要的数据都是在配置文件中配置的, 如:

  • 数据库的连接信息(包含用户名和密码的设置);
  • 项目的启动端口;
  • 第三方系统的调用秘钥等信息;
  • 用于发现和定位问题的普通日志和异常日志等 …

4.2 配置文件格式

主要有2种 :
.properties
.yml

在这里插入图片描述

4.2.1 properties

properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件.

1. 格式

在这里插入图片描述

2. 读取配置文件

使用@value注解实现.

@Value 注解使用“${}”的格式读取,如下代码所示 :

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    //读取系统配置项
    @Value("${server.port}")
    private Integer port;
    //读取用户配置项
    @Value("${mykey.key1}")
    private String mykey;

    @RequestMapping("/say")
    public String say() {
        return "我喜欢" + mykey + "当前端口号是" + port;
    }

}

在这里插入图片描述

注意 : 如果想正确识别中文 , 一定要修改字符集配置 , 如下图所示 :

在这里插入图片描述

在这里插入图片描述

3. 优缺点分析

在这里插入图片描述

4.2.2 yml

yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是"另一种标记语言".

1. 基础语法

大小写敏感
使用缩进表示层级关系
缩进不允许使用tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
'#'表示注释

2.支持的数据类型

  1. 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

  2. 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

  3. 纯量(scalars):单个的、不可再分的值

     一级目录
    

在这里插入图片描述

多级目录

在这里插入图片描述
在这里插入图片描述

3.读取配置文件的方法

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Value("${mykey}")
    private String kunkey;

    //读取系统配置项
    @Value("${server.port}")
    private Integer port;
    //读取用户配置项

    @RequestMapping("/say")
    public String say() {
        return "我喜欢" + kunkey + "当前端口号是" + port;
    }

}

运行结果 :

在这里插入图片描述
如果我们在properties和yml中出现了相同名称的自定义配置呢 ? 比如如下这种情况 :

在这里插入图片描述

仍然进行读取 :

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    
    @Value("${mykey.key1}")
    private String same;

    @RequestMapping("/say")
    public String say() {
        return "我喜欢" + same;
    }

}

运行结果 :

在这里插入图片描述
这说明properties的优先级高于yml .

在这里插入图片描述

前面谈到yml支持多种数据类型 , 下面一一介绍 :

Number1 : yml配置不同数据类型

先举一例 :

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Value("${string.value}")
    private String str;

    @RequestMapping("/say")
    public String say() {
        return str;
    }

}

application.yml

string.value: Hello

运行结果 :

在这里插入图片描述

同时支持的数据类型还有 :

# 字符串
string.value: Hello

# 布尔值,truefalse
boolean.value: true
boolean.value1: false

# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # 二进制

# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法

# Null~代表null
null.value: ~
Number2 : yml配置对象
student:
  id: 1
  name: zhangsan1
  age: 20

或者是使用行内写法 :

student: {id: 1,name: zhangsan,age: 18}

这个时候就不能用 @Value 来读取配置中的对象了,此时要使用另一个注解
@ConfigurationProperties 来读取,具体实现如下:

package com.example.demo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties(prefix = "student")
@Component
public class Student {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;

@RestController
public class StudentInfoRead {
    @Autowired
    private Student student;

    @PostConstruct
    public void readStudentInfo() {
        System.out.println(student);
    }

    @RequestMapping("/say")
    public Student say() {
        return student;
    }
}

运行结果 :

在这里插入图片描述

在这里插入图片描述

解释 :
在这里插入图片描述

总结 :

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

参考文章 :

  1. @PostConstruct注解

  2. Spring中的@RestController注解

  3. JSON数据格式详解

  4. RequestMapping的用法

Number3 : yml配置集合
原始写法
mylist1:
  talent:
    - sing
    - jump
    - rap
    - basketball
行内写法
mylist2: {talent: [sing,jump,rap,basketball]}

创建一个实体类 :

package com.example.demo.model2;

import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Getter
@Setter
@ConfigurationProperties(prefix = "mylist1")
@Component
public class MyList {
    private List talent;
}

在这里插入图片描述

进行读取 :

package com.example.demo.model2;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class readList {

    @Autowired
    private MyList talent; //talent是集合名称

    @RequestMapping("/list")
    public MyList func() {
        return talent;
    }
}

运行结果 :

在这里插入图片描述

Number4 : yml字符串修饰符问题
package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Value("${mykey.str1}")
    private String str1;

    @Value("${mykey.str2}")
    private String str2;

    @Value("${mykey.str3}")
    private String str3;


    @RequestMapping("/say")
    public String say() {
        System.out.println("str1 : " + str1);
        System.out.println();
        System.out.println("str2 : " + str2);
        System.out.println();
        System.out.println("str3 : " + str3);
        return "测试yml的字符串修饰符问题!";
    }

}

在这里插入图片描述

在这里插入图片描述

4. yml的多平台设置问题

以数据库配置为例

在这里插入图片描述

application-dev.yml

server:
  port: 8888

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/blog_system?chararcterEncoding=utf8
    username: root
    password: 12345678

mykey:
  key1: dev


application-prod.yml

server:
  port: 11111

spring:
  datasource:
    url: jdbc:mysql://yyyy:3306/blog_system?chararcterEncoding=utf8
    username: root
    password: 12345678

mykey:
  key1: prod

application-test.yml

server:
  port: 9999

spring:
  datasource:
    url: jdbc:mysql://xxxx:3306/blog_system?chararcterEncoding=utf8
    username: root
    password: 12345678

mykey:
  key1: test

在主配置文件中设置环境 :

application.yml

spring:
  profiles:
    active: dev
package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Value("${mykey.key1}")
    private String key;
    @RequestMapping("/say")
    public String say() {
        return "这是一个" + key + "的配置文件";
    }
}

运行结果 :

在这里插入图片描述

同时可以查看端口号 :

在这里插入图片描述

可以实现在不同的IP地址访问同一数据库操作 .

5. 优缺点分析

在这里插入图片描述

五 : SpringBoot的日志文件

5.1 日志的作用

日志是程序的重要组成部分,想象一下,如果程序报错了,不让你打开控制台看日志,那么你能找到报错的原因吗?

在这里插入图片描述
除了发现和定位问题之外,我们还可以通过日志实现以下功能 :

  1. 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户 ;
  2. 记录系统的操作日志,方便数据恢复和定位操作人员 ;
  3. 记录程序的执行时间,方便为以后优化程序提供数据支持 .

Spring Boot在启动的时候 , 也有默认的日志 , 比如这些 :

在这里插入图片描述

5.2 自定义日志打印

日志对象的打印方法有很多种,我们可以先使 info()来输出日志,代码如下所示:
package com.example.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    //1.得到日志对象
    private Logger logger = LoggerFactory.getLogger(TestController.class);

    @Value("${mykey.key1}")
    private String key;
    
    @RequestMapping("/say")
    public String say() {
        logger.info("------------这是我自己打印的日志------------");
        return "这是一个" + key + "的配置文件";
    }
}

在这里插入图片描述

运行结果 :

在这里插入图片描述

在这里插入图片描述
因为 Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调用slf4j 来输出日志 .

5.3 日志持久化

以上的日志都是输出在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化.

介绍两种方法:
1.设置日志的名称;
2.设置日志的保存路径.

1. 设置日志的名称

logging:
 file:
  name: springboot.log

在这里插入图片描述

启动项目 , 查看项目路径 :

在这里插入图片描述
在这里插入图片描述
再次运行项目 :

在这里插入图片描述
说明 :

  1. 日志不会丢失 , 会一直追加 ;
  2. 日志比较大时 , 会自动分割为多个文件 .

2.设置日志的路径

logging:
  file:
   path: C:\\logtest

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.4 其他打印日志的方式

package com.example.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    //1.得到日志对象
    private Logger log = LoggerFactory.getLogger(TestController.class);

    @Value("${mykey.key1}")
    private String key;

    @RequestMapping("/say")
    public String say() {
        log.trace("Hi,i am trace.");
        log.debug("Hi,i am debug.");
        log.info("Hi,i am info.");
        log.warn("Hi,i am warn.");
        log.error("Hi,i am error.");
        return key;
    }
}

运行结果 :

在这里插入图片描述

大家可能会奇怪了 , 我的trace和debug的信息为什么没有在控制台输出呢 ? 这就涉及到日志级别问题了 .

5.5 日志级别

1. 日志级别的作用

  1. 日志级别可以帮我们筛选重要的信息 , 比如设置日志级别为error , 就可以只看程序的报错日志了 , 对于普通的调试日志和业务日志就可以忽略了,从而节省开发者信息筛选的时间 ;
  2. 日志级别可以控制不同环境下,一个程序是否需要打印日志,如开发环境我们需要很详细的信息,而生产环境为了保证性能和安全性就会输出尽量少的日志,而通过日志的级别就可以实现此需求 . 一般我们会设置包的日志级别 , 但很少给每一个类单独设置日志级别 , 这样操作难度太大 , 而且也没有这个必要 .

2. 日志级别的分类

在这里插入图片描述

日志级别顺序 :

在这里插入图片描述

他爹级别低 , 爱我儿发级别高 . (仅用于助记)

越往上接收到的消息就越少,如设置了 warn 就只能收到 warn、error、fatal 级别的日志了 .

3. 日志级别的配置

日志级别配置只需要在配置文件中设置“logging.level”配置项即可 :

#设置根路径的日志级别
logging:
  level:
    root: debug

运行效果如下 :

在这里插入图片描述

此时控制台的输出就包含了许多debug级别的日志了 .

访问网页 , 观察控制台输出 :

在这里插入图片描述

#设置自己项目目录文件的日志级别
logging:
  level:
    com:
      example:
        demo: error

项目结构如图所示 :

在这里插入图片描述

此时访问网页 , 只打印了一条日志 :

在这里插入图片描述

5.6 简化写法

原来添加日志对象 :

package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    //1.得到日志对象
    private Logger log = LoggerFactory.getLogger(TestController.class);

    @Value("${mykey.key1}")
    private String key;

    @RequestMapping("/say")
    public String say() {
        log.trace("Hi,i am trace.");
        log.debug("Hi,i am debug.");
        log.info("Hi,i am info.");
        log.warn("Hi,i am warn.");
        log.error("Hi,i am error.");
        return key;
    }
}

简化写法 :

package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class TestController {

    @Value("${mykey.key1}")
    private String key;

    @RequestMapping("/say")
    public String say() {
        log.trace("Hi,i am trace.");
        log.debug("Hi,i am debug.");
        log.info("Hi,i am info.");
        log.warn("Hi,i am warn.");
        log.error("Hi,i am error.");
        return key;
    }
}

在这里插入图片描述

查看字节码 , 你就知道@Slf4j在底层实现时做了怎样的替换 :

在这里插入图片描述
在这里插入图片描述

你会发现 , 代码中并没有出现@Slf4j , 取而代之的是这行代码 !

如果你无法导入@Slf4j , 需要手动添加依赖 , 方法如下 :

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
同时 , 你也可以安装此插件实现依赖引入 :

在这里插入图片描述

本节内容到此结束 !

请添加图片描述

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

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

相关文章

深度学习系列2——Pytorch 图像分类(AlexNet)

1. 概述 本文主要是参照 B 站 UP 主 霹雳吧啦Wz 的视频学习笔记,参考的相关资料在文末参照栏给出,包括实现代码和文中用的一些图片。 整个工程已经上传个人的 github https://github.com/lovewinds13/QYQXDeepLearning ,下载即可直接测试&a…

你了解PMP考试新考纲的内容吗?

2021年新版PMP考纲变化趋势 随着时代发展,PMP认证本身也通过改版不断调整定位,与全球项目管理趋势相匹配,确保在全球项目管理专业领域保持“黄金标准”。 新版本变化如下: 五大过程组变为三大板块。之前一直沿用的“启动、规划…

Transformer时间序列预测

介绍: 提示:Transformer-decoder 总体介绍 本文将介绍一个 Transformer-decoder 架构,用于预测Woodsense提供的湿度时间序列数据集。该项目是先前项目的后续项目,该项目涉及在同一数据集上训练一个简单的 LSTM。人们认为 LSTM 在…

阿里P8总结的Nacos入门笔记,从安装到进阶小白也能轻松学会

前言 都说程序员工资高、待遇好, 2022 金九银十到了,你的小目标是 30K、40K,还是 16薪的 20K?作为一名 Java 开发工程师,当能力可以满足公司业务需求时,拿到超预期的 Offer 并不算难。然而,提升…

GPC规范-SCP02

SPC02 流程 SPC02 指令 命令: 响应: 举例回复: 密钥分散数据: 0000FFFFFFFFFFFFFFFF Key Info: 20 02(scp02) Card挑战数: 001AC6619BE83082 Card加密值: 7…

leetcode刷题(133)——剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] Output: [3,9,20,null,null,15,7]示例 2: Input: preord…

(十一)笔记.net学习表达式目录树Expression

(十一)笔记.net学习表达式目录树Expression1.什么是表达式目录树(1)Func和表达式的不同(2)表达式树拆解(3)自己拼装表达式目录2.动态拼装表达式目录和扩展应用3.解析表达式目录&…

阿里云服务器采用AMD CPU处理器ECS实例规格详解

阿里云服务器有AMD CPU处理器,阿里云服务器ECS通用型g7a、计算型c7a和内存型r7a采用2.55 GHz主频的AMD EPYCTM MILAN处理器,单核睿频最高3.5 GHz;通用型g6a、计算型c6a和内存型r6a采用2.6 GHz主频的AMD EPYCTM ROME处理器,睿频3.3…

MySQL读取的记录和我想象的不一致——事物隔离级别和MVCC

本篇是《MySQL是怎样运行的》读书笔记,主要分析并发的事务在运行过程中会出现一些可能引发一致性问题的现象。 文章目录1.事务的特性简介1.1 原子性(Atomicity)1.2 隔离性(Isolation)1.3 一致性(Consistenc…

JUC基础

synchronized 复习虚假唤醒什么是虚假唤醒虚假唤醒产生的原因?解决虚假唤醒?Lock接口ReentrantLock 和 synchronized 的区别Lock 实现线程通信Lock 实现线程定制化通信集合线程安全ArrayListHashSetHashMapsynchronized 锁的范围多线程锁公平锁和非公平锁…

CameraMetadata 知识学习整理

一、涉及的相关代码路径 system/media/camera/src/camera_metadata.c // metadata的核心内容,包含metadata内存分配,扩容规则,update, find等 system/media/camera/src/camera_metadata_tag_info.c // 所有android原生tag的在内存里面sect…

22/11/24

1,单调队列; (76条消息) 单调队列专题_Dull丶的博客-CSDN博客 2,kmp算法; 先是自己和自己匹配,求出ne数组,然后和另一串匹配,进行求解; 循环里三步:while&#xff0c…

【Lilishop商城】No2-3.确定软件架构搭建二(本篇包括接口规范、日志处理)

仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在: 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇只介绍重点架构逻辑,具体编写看源代码就行,读起来也不复杂~ 谨慎&#xf…

【数据聚类】基于粒子群、遗传和差分算法实现数据聚类附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

【App自动化测试】(十)特殊控件Toast识别

目录1. toast介绍2. toast定位3. 实例演示前言: 本文为在霍格沃兹测试开发学社中学习到的一些技术写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 😘 1. toast介绍 Toast,简易的消息提示框。为了…

CANdelaStudio-从入门到深入目录

前文介绍诊断协议那些事儿专栏,为大家深入介绍了ISO 14229各个服务的基础知识、请求与响应的报文格式,详情可查看:诊断协议那些事儿,从本专题开始,将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希…

HTML5学习笔记(四)

CSS3 颜色样式 在CSS3中,增加了大量定义颜色方面样式的属性,主要包括以下3种。 ▶ opacity透明度 ▶ RGBA颜色 ▶ CSS3渐变 opacity透明度 opacity属性取值是一个数值,取值范围为0.0~1.0。其中0.0表示完全透明,1.0表示完全不透…

I/O模型

网络IO的本质 网络IO的本质就是socket流的读取,通常一次IO读取会涉及两个阶段与两个对象,其中两个对象为:用户进程(线程)Process(Thread)、内核对象(kernel),两个阶段为…

北方地区长乐市污水厂(150000m3d)工艺设计

目 录 1设计说明书 3 1.1概述 3 1.1.1设计题目 3 1.1.2设计任务 3 1.1.3设计阶段(设计程度) 3 1.1.4设计依据 3 1.1.5设计原始资料 3 1.1.6设计工作量 5 1.1.7设计要求 5 1.1.8 毕业设计日期 5 1.2 设计要求 6 1.2.1 设计原则 6 1.2.3 设计内容 6 1.3 水…

PLC中ST编程的比较运算

比较运算符&#xff1a; >大于、 <小于、 >大于等于、 <小于等于、等于、 <>不等于。 BOOL类型的比较是通过1&#xff08;TRUE&#xff09;和0&#xff08;FALSE&#xff09;来比较的&#xff1b; 只有xIn_1为真&#xff0c;xIn_2为假的时候&#xff0c;xRe…