SpringBoot2

网课链接 https://www.bilibili.com/video/BV19K4y1L7MT?from=search&seid=18416616320162201024

参考笔记 https://blog.csdn.net/u011863024/article/details/113667634

​ https://blog.csdn.net/u011863024/article/details/113667946

官网 https://spring.io/

代码 https://gitee.com/userwhz/springboot-ssg

SpringBoot2基础入门

Spring

作用Web开发数据访问安全控制分布式消息服务移动开发批处理Spring5引入响应式开发基于Java8新特性,如接口默认实现,源码发生改变

SpringBoot

优点创建独立Spring应该内嵌web服务器       自动starter依赖,简化构建配置自动配置Spring以及第三方功能提供生产级别的监控,健康检查及外部化配置无代码生成,无需编写xml缺点版本迭代太快封装太深,内部原理复杂,不容易精通SpringBoot整合Spring技术栈的一站式框架简化Spring技术栈的快速开发脚手架微服务架构风格一个应用拆分为一组小型服务每个服务都运行在注解的进程内,可以独立部署和升级服务之间使用轻量级HTTP交互服务围绕业务功能拆分可以全自动部署机制独立部署去中心化,服务自治,服务可以使用不用的语言,不同的存储技术分布式云原生上云的困难- 服务自愈
- 弹性伸缩
- 服务隔离
- 自动化部署
- 灰度发布
- 流量治理

SpringBoot2入门


SpringBoot官网    https://spring.io/projects/spring-boot#learn需求:浏览发送/hello请求,响应 “Hello,Spring Boot 2”创建maven工程引入依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version>
</parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>编写主程序类@SpringBootApplication标志主程序类配置文件可以直接设置端口号测试直接运行main简化部署 默认打包为jar引入插件<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>报红需要加上版本号打包package运行cmd java -jar jar包名

依赖管理机制

父项目做依赖管理​        几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制开发导入starter场景启动器​        spring-boot-starter-* : *代表某种场景​     只要引入starter,这个场景的所有常规需要的依赖我们都自动引入​       所有的starter  https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters​     见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。无需关注版本号,自动版本仲裁1. 引入依赖默认都可以不写版本
2. 引入非版本仲裁的jar,要写版本号。可以修改默认版本号1. 查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。
2. 在当前项目里面重写配置,如下面的代码。所有场景启动器最底层的依赖      自动配置的核心依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.3.4.RELEASE</version><scope>compile</scope>
</dependency>

自动配置特性

自动配好Tomcat​  引入Tomcat依赖​ 配置Tomcat<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.3.4.RELEASE</version><scope>compile</scope>
</dependency>自动配好SpringMVC​       引入SpringMVC全套组件​        自动配好SpringMVC常用组件(功能)自动配好Web常见功能,如:字符编码问题​      SpringBoot帮我们配置好了所有web开发的常见场景```
public static void main(String[] args) {
//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {System.out.println(name);}
}
```默认的包结构​       主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来​      无需以前的包扫描配置​     想要改变扫描路径​           @SpringBootApplication(scanBasePackages=“com.atguigu”)​           或者@ComponentScan 指定扫描路径@SpringBootApplication等同于@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan("com.atguigu")各种配置拥有默认值​      默认配置最终都是映射到某个类上,如:MultipartProperties​        配置文件的值最终会绑定每个类上,这个类会在容器中创建对象按需加载所有自动配置项​     非常多的starter​        引入了哪些场景这个场景的自动配置才会开启​       SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面

底层注解


@Configuration 配置类注解   (proxyBeanMethods = true)是不是代理bean的方法 默认true   spring boot总会检测组件是否存在如果false    则不是单实例Full(proxyBeanMethods = true)(保证每个@Bean方法被调用多少次返回的组件都是单实例的)(默认) Lite(proxyBeanMethods = false)(每个@Bean方法被调用多少次返回的组件都是新创建的)如果没有组件依赖,那么调成false可以提高效率@Bean 可以自定义名字 默认方法名   单实例@Component  @Controller    @Service   @Repository@ComponentScan @Import    @Import({User.class, DBHelper.class})  自动创建出这两个类型的组件、默认组件的名字就是全类名@Conditional 条件装配    满足Conditional指定的条件,则进行组件注入   不满足则不注入@ImportResource("classpath:beans.xml")     迁移xml文件    容器将导入组件@ConfigurationProperties    配置绑定        (prefix = "mycar")   前缀  加到@Component配置类加属性绑定   @EnableAutoConfiguration 把组件自动注入到容器    +  @ConfigurationProperties

自动配置(源码分析)

@SpringBootApplication等同于- @SpringBootConfiguration    配置类- @EnableAutoConfiguration  ​       @AutoConfigurationPackage  自动配置包​          利用Registrar给容器中导入一系列组件​         将指定的一个包下的所有组件导入进MainApplication所在包下。​       @Import({AutoConfigurationImportSelector.class})​      1)利用getAutoConfigurationEntry(annotationMetadata)    给容器中批量导入一些组件​       2)调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)​             获取到所有需要导入到容器中的配置类​      3)利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件​      4)从META-INF/spring.factories位置来加载一个文件。​                  默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件​                   spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories​      # 文件里面写死了spring-boot一启动就要给容器中加载的所有配置类 -  @ComponentScan    指定扫描哪些Spring注解。SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。(xxxxProperties里面读取,xxxProperties和配置文件进行了绑定)生效的配置类就会给容器中装配很多组件只要容器中有这些组件,相当于这些功能就有了定制化配置​  用户直接自己@Bean替换底层的组件​    用户去看这个组件是获取的配置文件什么值就去修改。xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties

开发步骤


1)引入依赖2)查看自动配置了哪些 选做自己分析  配置文件中debug=true开启自动配置报告3)是否需要修改参照文档修改配置项https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#common-application-properties​   自己分析。xxxxProperties绑定了配置文件的哪些。自定义加入或者替换组件​  @Bean、@Component…自定义器 XXXXXCustomizer;

开发小技巧

Lombok简化开发引入依赖安装插件@Data 生成get和set方法@ToString@AllArgsConstructor   全参构造器@NoArgsConstructor    无参构造器@EqualsAndHashCode@Slf4j log.info("日志信息")热更新<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>
</dependencies>ctrl + f9     项目重启Spring Initailizrstatic 静态资源templates   页面

SpringBoot2核心功能

配置文件


propertiesyaml/yml标记语言适合以数据为中心的配置文件基本语法- key: value kv之间有空格
- 区分大小写
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
- 字符串无需加引号,如果要加,单引号’’,双引号""表示字符串内容会被 转义,不转义Spring Boot Configuration Annotation Processor not configured 问题解决<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>打包时去除依赖<exclude><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId>
</exclude>

web开发

SpringMVC自动配置


大多场景我们都无需自定义配置- 内容协商视图解析器和BeanName视图解析器
- 静态资源(包括webjars)
- 自动注册 `Converter,GenericConverter,Formatter`- 支持 `HttpMessageConverters` (后来我们配合内容协商理解原理)- 自动注册 `MessageCodesResolver` (国际化用)
- 静态index.html 页支持- 自定义 `Favicon`
- 自动使用 `ConfigurableWebBindingInitializer` ,(DataBinder负责将请求数据绑定到JavaBean上)

静态资源访问

静态资源目录静态资源放在类路径下: called `/static` or `/public` or `/resources` or `/META-INF/resources`访问:当前项目根路径/ + 静态资源名原理: 静态映射/**请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面。改变默认的静态资源路径,/static,/public,/resources, /META-INF/resources失效resources:  static-locations: [classpath:/haha/]spring:  ​  mvc:   ​         static-path-pattern: /res/**静态资源访问前缀当前项目 + static-path-pattern + 静态资源名 = 静态资源文件夹下找

欢迎页支持


静态资源路径下 index.html- 可以配置静态资源路径
- 但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问controller能处理/index

请求参数处理


@xxxMapping;- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping用法- 开启页面表单的Rest功能
- 页面 form的属性method=post,隐藏域 _method=put、delete等(如果直接get或post,无需隐藏域)
- 编写请求映射常用参数注解@PathVariable 路径变量@RequestHeader 获取请求头信息@RequestParam 获取请求参数(指问号后的参数)    @CookieValue 获取Cookie值@RequestAttribute 获取request域属性@RequestBody 获取请求体[POST]@MatrixVariable 矩阵变量@ModelAttribute

视图解析与模板引擎


SpringBoot默认不支持JSP,需要引入第三方模板引擎技术实现页面渲染引入依赖页面放/templates下面server:  ​  servlet:    ​       context-path: /app *#设置应用名*这个设置后,URL要插入`/app`, 如`http://localhost:8080/app/hello.html`

拦截器


登录检查与静态资源放行编写一个拦截器实现HandlerInterceptor接口拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors())指定拦截规则(注意,如果是拦截所有,静态资源也会被拦截)目标方法执行之前
目标方法执行完成以后
页面渲染以后拦截器注册到容器中 && 指定拦截规则@Configuration
public class AdminWebConfig implements WebMvcConfigure

文件上传

文件上传相关的配置类:org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.MultipartPropertiesspring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB

错误处理


- 默认情况下,Spring Boot提供`/error`处理所有错误的映射
- 机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据要对其进行自定义,添加View解析为error要完全替换默认行为,可以实现 ErrorController并注册该类型的Bean定义,或添加ErrorAttributes类型的组件以使用现有机制但替换其内容。/templates/error/下的4xx,5xx页面会被自动解析

原生组件注入

@WebServlet@WebFilter@WebListener还要在主启动类添加注解`@ServletComponentScan`Spring方式注入ServletRegistrationBean`, `FilterRegistrationBean`, and `ServletListenerRegistrationBean

定制化原理

定制化的常见方式1)修改配置文件2)xxxxxCustomizer3)编写自定义的配置类 xxxConfiguration + @Bean替换、增加容器中默认组件,视图解析器4)Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能 + @Bean给容器中再扩展一些组件5)@EnableWebMvc + WebMvcConfigurer — @Bean 可以全面接管SpringMVC,所有规则全部自己重新配置; 实现定制和扩展功能(高级功能)。

数据访问


数据源的自动配置导入JDBC依赖导入了数据源jdbc事务但没有导入驱动(不知道要操作的数据库)导入mysql驱动相关数据源配置类  自动配置的类DataSourceAutoConfiguration : 数据源的自动配置。修改数据源相关的配置:spring.datasource。数据库连接池的配置,是自己容器中没有DataSource才自动配置的。底层配置好的连接池是:HikariDataSource。DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置。JdbcTemplateAutoConfiguration: JdbcTemplate的自动配置,可以来对数据库进行CRUD。@Bean @Primary JdbcTemplate:Spring容器中有这个JdbcTemplate组件,使用@Autowired。JndiDataSourceAutoConfiguration: JNDI的自动配置。XADataSourceAutoConfiguration: 分布式事务相关的。Spring Boot整合第三方技术的两种方式:- 自定义
- 找starter场景使用Druid数据源<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.17</version>
</dependency>配置Druid数据源druid数据源starter整合方式<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version>
</dependency>配置文件配置整合Mybatis引入依赖<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version>
</dependency>全局配置文件SqlSessionFactory:自动配置好了SqlSession:自动配置了SqlSessionTemplate 组合了SqlSession@Import(AutoConfiguredMapperScannerRegistrar.class)Mapper: 只要我们写的操作MyBatis的接口标准了@Mapper就会被自动扫描进来导入MyBatis官方Starter。编写Mapper接口,需@Mapper注解。编写SQL映射文件并绑定Mapper接口。在application.yaml中指定Mapper配置文件的所处位置,以及指定全局配置文件的信息 (建议:配置在mybatis.configuration)。整合MyBatis-注解配置混合整合Mybatis Plus引入依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version>
</dependency>MybatisPlusAutoConfiguration配置类,MybatisPlusProperties配置项绑定。SqlSessionFactory自动配置好,底层是容器中默认的数据源。mapperLocations自动配置好的,有默认值classpath*:/mapper/**/*.xml,这表示任意包的类路径下的所有mapper文件夹下任意路径下的所有xml都是sql映射文件。 建议以后sql映射文件放在 mapper下。容器中也自动配置好了SqlSessionTemplate。@Mapper 标注的接口也会被自动扫描,建议直接 @MapperScan("com.lun.boot.mapper")批量扫描。MyBatisPlus优点之一:只需要我们的Mapper继承MyBatisPlus的BaseMapper 就可以拥有CRUD能力,减轻开发工作。整合RedisRedisAutoConfiguration自动配置类,RedisProperties 属性类 --> spring.redis.xxx是对redis的配置。连接工厂LettuceConnectionConfiguration、JedisConnectionConfiguration是准备好的。自动注入了RedisTemplate<Object, Object>,xxxTemplate。自动注入了StringRedisTemplate,key,value都是String底层只要我们使用StringRedisTemplate、RedisTemplate就可以操作Redis。

单元测试


JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit VintageJUnit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部包含了一个测试引擎,用于在Junit Platform上运行。JUnit Vintage: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,JUnit3.x的测试引擎。SpringBoot 2.4 以上版本移除了默认对 Vintage 的依赖。如果需要兼容JUnit4需要自行引入(不能使用JUnit4的功能 @Test)JUnit 5’s Vintage已经从spring-boot-starter-test从移除。如果需要继续兼容Junit4需要自行引入Vintage依赖:引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>@SpringBootTest 常用测试注解@Test:表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试@ParameterizedTest:表示方法是参数化测试。@RepeatedTest:表示方法可重复执行。@DisplayName:为测试类或者测试方法设置展示名称。@BeforeEach:表示在每个单元测试之前执行。@AfterEach:表示在每个单元测试之后执行。@BeforeAll:表示在所有单元测试之前执行。@AfterAll:表示在所有单元测试之后执行。@Tag:表示单元测试类别,类似于JUnit4中的@Categories。@Disabled:表示测试类或测试方法不执行,类似于JUnit4中的@Ignore。@Timeout:表示测试方法运行如果超过了指定时间将会返回错误。@ExtendWith:为测试类或测试方法提供扩展类引用。断言机制这些断言方法都是org.junit.jupiter.api.Assertions的静态方法。检查业务逻辑返回的数据是否合理。所有的测试运行结束以后,会有一个详细的测试报告。简单断言方法  说明assertEquals  判断两个对象或两个原始类型是否相等assertNotEquals    判断两个对象或两个原始类型是否不相等assertSame    判断两个对象引用是否指向同一个对象assertNotSame  判断两个对象引用是否指向不同的对象assertTrue 判断给定的布尔值是否为 trueassertFalse 判断给定的布尔值是否为 falseassertNull 判断给定的对象引用是否为 nullassertNotNull  判断给定的对象引用是否不为 null数组断言通过 assertArrayEquals 方法来判断两个对象或原始类型的数组是否相等。组合断言`assertAll()`方法接受多个 `org.junit.jupiter.api.Executable` 函数式接口的实例作为要验证的断言,可以通过 lambda 表达式很容易的提供这些断言。异常断言在JUnit4时期,想要测试方法的异常情况时,需要用`@Rule`注解的`ExpectedException`变量还是比较麻烦的。而JUnit5提供了一种新的断言方式`Assertions.assertThrows()`,配合函数式编程就可以进行使用。超时断言JUnit5还提供了Assertions.assertTimeout()为测试方法设置了超时时间。快速失败通过 fail 方法直接使得测试失败。前置条件Unit 5 中的前置条件(assumptions【假设】)类似于断言,不同之处在于不满足的断言assertions会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要。嵌套测试JUnit 5 可以通过 Java 中的内部类和`@Nested` 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用`@BeforeEach` 和`@AfterEach`注解,而且嵌套的层次没有限制。参数化测试参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利。利用@ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。利用**@ValueSource**等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。@ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型@NullSource: 表示为参数化测试提供一个null的入参@EnumSource: 表示为参数化测试提供一个枚举入参@CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参@MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流)当然如果参数化测试仅仅只能做到指定普通的入参还达不到让我觉得惊艳的地步。让我真正感到他的强大之处的地方在于他可以支持外部的各类入参。如:CSV,YML,JSON 文件甚至方法的返回值也可以作为入参。只需要去实现**ArgumentsProvider**接口,任何外部文件都可以作为它的入参。

高级特性

Profile环境切换为了方便多环境适配,Spring Boot简化了profile功能。配置加载优先级外部配置源Java属性文件。YAML文件。环境变量。命令行参数。配置文件查找位置classpath 根路径。classpath 根路径下config目录。jar包当前目录。jar包当前目录的config目录。/config子目录的直接子目录。配置文件加载顺序:当前jar包内部的application.properties和application.yml。当前jar包内部的application-{profile}.properties 和 application-{profile}.yml。引用的外部jar包的application.properties和application.yml。引用的外部jar包的application-{profile}.properties和application-{profile}.yml。指定环境优先,外部优先,后面的可以覆盖前面的同名配置项。自定义starter

SpringBoot2尚硅谷笔记相关推荐

  1. 2、Spring Boot尚硅谷笔记整理高级篇-消息

    1.Spring Boot尚硅谷笔记整理高级篇-缓存 2.Spring Boot尚硅谷笔记整理高级篇-消息 3.Spring Boot尚硅谷笔记整理高级篇-检索 4.Spring Boot尚硅谷笔记整 ...

  2. MySQL基础(尚硅谷笔记)

    基于尚硅谷MySQL视频的学习笔记 目录 1. 初识MySQL 1.1 数据库相关概念 1.2 MySQL介绍 2. DQL语言 2.1 基础查询 2.2 条件查询 2.3 排序查询 2.4 常见函数 ...

  3. 【数据库】2、索引、调优、explain(尚硅谷笔记)

    尚硅谷JAVA研究院 版本v1.1 第 1 章 MySQL 简介 1.什么是 Mysql MySQL 是一个关系型数据库管理系统, 由瑞典 MySQL AB 公司开发, 目前属于 Oracle 公司. ...

  4. MySQL尚硅谷笔记

    MySQL 网课链接 https://www.bilibili.com/video/BV1KW411u7vy?p=1 相关笔记链接 https://github.com/RingoTangs/Lear ...

  5. Vue项目环境配置(尚硅谷笔记)

    文章目录 Vue3项目继承 一.项目集成 3.1集成element-plus 3.2src别名的配置 3.3环境变量的配置 3.4SVG图标配置 3.4.1svg封装为全局组件 3.5集成sass 3 ...

  6. gradle尚硅谷笔记

    gradle安装 1.springboot要求版本6.8以上,并且idea也有gradle版本要求,idea的plugins gradle记录了需要的版本 2.配置环境变量 1)系统变量新建 GRAD ...

  7. Javase尚硅谷笔记

    自动类型提升: 结论:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型. byte.char.short–>int–> 1ong–> floa ...

  8. 尚硅谷笔记——React组件的三大属性props、state、ref

    state  理解 state是组件对象最重要的属性, 值是对象(可以包含多个key-value的组合) 组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新 ...

  9. go语言基础精修(尚硅谷笔记)

    一.Golang的学习方向 1.1 Go的学习方向 Go语言,可以简单写成Golang(lang是language) 区块链研发工程师 Go服务器端/游戏软件工程师 Golang分布式/云计算软件工程 ...

最新文章

  1. Vue---自定义组件
  2. Flat - Music scores and guitar tabs editor(乐谱编辑器)
  3. svn无法读取日志问题解决
  4. 元数据交换绑定的秘密
  5. 十六款值得关注的NoSQL与NewSQL数据库--转载
  6. android编程读取sd卡txt文件,如何读取SD卡中的txt文件?
  7. 形态学图像处理学习笔记
  8. android分辨率hdpi,Android资源 - 哪些分辨率应该进入hdpi,ldpi,mdpi和xhdpi目录
  9. Vue源码分析系列四:Virtual DOM
  10. 人体轮廓_女性人体油画轮廓柔和生动,优美动人,你喜欢吗?
  11. 命令行下Apache日志统计举例
  12. [转]OC与JS的交互详解
  13. python创建自定义函数is_number()来判断一个字符是否是数字
  14. [导入]js 关联数组 详解
  15. node.val java_LeetCode——21. 合并两个有序链表(Java)
  16. xshell5安装包(百度云),官方免费版,不会强制更新,没有标签限制(2019-4-4)
  17. C语言程序员面试100题,c语言面试最必考的十道试题,求职必看!!!
  18. 读《曾经,我们爱过一个世纪》有感(附原文)
  19. 如何下载ArcGis Server离线地图瓦片数据
  20. 01_搭建百度apollo环境实操可用

热门文章

  1. 盘点2018年化工行业大事故!回顾那些令人心痛的瞬间......
  2. Oracle甲骨文官网必须登录怎么办!!?
  3. 一步一回头撞在了南墙上
  4. 24点小游戏(C语言实现)
  5. Stata:因子变量全攻略-双向固定效应-超越对数生产函数
  6. 云和大数据,铺就宁夏特色“信息高速路”
  7. 青龙面板2.8版本+Ninja 保姆级 服务器安装jd代挂教程——(二)
  8. 计算机应用职业的外部环境,完整的职业生涯规划书范文
  9. Windows-EFS加密文件
  10. Win10系统邮件添加QQ邮件账户