前言

SpringBoot的配置文件

配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的。

application.properties

application.yml

配置文件的作用: 修改SpringBoot的自动配置的默认值,SpringBoot在底层都给我们自动配置好;

YAML(YAML Ain't Markup Language)

YAML A Markup Language:是一个标记语言

YAML isn't Markup Language:不是一个标记语言;

标记语言:

以前的配置文件;大多都使用的是 xxxx.xml文件;

YAML:以数据为中心,比json、xml等更适合做配置文件;

YAML:配置例子

server:
port: 8081

XML:

     <server>
<port>8081</port>
</server>

创建config项目

我们使用快速创建,直接创建就好了,这里不做详细的演示

application.properties的优先级高于application.yml

YAML语法

1. 基本语法

k:(空格)v:表示一对键值对(空格必须有)

空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

server:
port: 8081
path: /hello

属性和值也是大小写敏感

**2. 值的写法 **

2.1 字面量:普通的值(数字,字符串,布尔)

k: v:字面直接来写;

  • 字符串默认不用加上单引号或者双引号
  • "":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name:   "zhangsan \n lisi":输出: zhangsan 换行  lisi
  • '':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name:   'zhangsan \n lisi':输出: zhangsan \n  lisi



2.2 对象、Map(属性和值)(键值对)

k: v:在下一行来写对象的属性和值的关系,注意缩进;

对象还是k: v的方式

    friends:
astName: zhangsan
age: 20

行内写法

    friends: {lastName: zhangsan,age: 18}

2.3 数组(List、Set)

- 值表示数组中的一个元素

pets:
- cat
- dog
- pig

行内写法

pets: [cat,dog,pig]

配置文件值注入(一)

配置文件

application.properties

# 配置person的值
person.lats-name=hello
person.age=18
person.birthday=2018/12/12
person.boy=false
person.maps.k1=岁月
person.maps.k2=yes
person.lists=1,2,3
person.dog.name=hi
person.dog.age=2

application.yml

server:
port: 8081 person:
LatsName: helloworld
Age: 16
boy: true
birthday: 2018/12/12
maps: {k1: v1, k2: 12}
lists:
- hello
- world
- test
dog:
name: 花花
age: 2

创建一个Person类文件

package com.wangyang.springboot.people;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; import javax.xml.crypto.Data;
import java.util.Date;
import java.util.List;
import java.util.Map; /**
* 将配置文件中的值映射到组件中
* @ConfigurationProperties 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix = "person" 配置文件中那个下面的所有属性进行配置
*
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String LatsName;
private Integer Age;
private boolean boy;
private Date birthday; private Map<String,Object> maps;
private List<Object> lists;
private Dog dog; @Override
public String toString() {
return "Person{" +
"LatsName='" + LatsName + '\'' +
", Age=" + Age +
", boy=" + boy +
", birthday=" + birthday +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
} public String getLatsName() {
return LatsName;
} public void setLatsName(String latsName) {
LatsName = latsName;
} public Integer getAge() {
return Age;
} public void setAge(Integer age) {
Age = age;
} public boolean isBoy() {
return boy;
} public void setBoy(boolean boy) {
this.boy = boy;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public Map<String, Object> getMaps() {
return maps;
} public void setMaps(Map<String, Object> maps) {
this.maps = maps;
} public List<Object> getLists() {
return lists;
} public void setLists(List<Object> lists) {
this.lists = lists;
} public Dog getDog() {
return dog;
} public void setDog(Dog dog) {
this.dog = dog;
}
}

创建DOG类文件

package com.wangyang.springboot.people;

public class Dog {
private String name;
private Integer age; @Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

快速创建get和set方法

ALT+INSERT=>Getter and Setter

快速创建toString方法

ALT+INSERT=>toSting()

配置文件处理器

Configuration Metadata

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

单元测试

package com.wangyang.springboot;

import com.wangyang.springboot.people.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; /**
* SpringBoot单元测试
*
* 可以在测试期间很方便的类似编码一样进行自动注入功能
*/
@SpringBootTest
class SpringBoot02ConfigApplicationTests { @Autowired
Person person;
@Test
public void contextLoads() {
System.out.println(person);
} }

application.yml

application.properties

中文乱码如何修复

ctrl+alt+s快速打开设置

重新运行

配置文件注入(二)

package com.wangyang.springboot.people;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; import javax.xml.crypto.Data;
import java.util.Date;
import java.util.List;
import java.util.Map; /**
* 将配置文件中的值映射到组件中
* @ConfigurationProperties 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix = "person" 配置文件中那个下面的所有属性进行配置
*
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
*/
@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
/**
* <bean class="Person">
* <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
* <bean/>
*/
@Value("${person.lats-name}")
private String LatsName;
@Value("#{10*2}")
private Integer Age;
@Value("true")
private boolean boy;
private Date birthday; private Map<String,Object> maps;
private List<Object> lists;
private Dog dog; @Override
public String toString() {
return "Person{" +
"LatsName='" + LatsName + '\'' +
", Age=" + Age +
", boy=" + boy +
", birthday=" + birthday +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
} public String getLatsName() {
return LatsName;
} public void setLatsName(String latsName) {
LatsName = latsName;
} public Integer getAge() {
return Age;
} public void setAge(Integer age) {
Age = age;
} public boolean isBoy() {
return boy;
} public void setBoy(boolean boy) {
this.boy = boy;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public Map<String, Object> getMaps() {
return maps;
} public void setMaps(Map<String, Object> maps) {
this.maps = maps;
} public List<Object> getLists() {
return lists;
} public void setLists(List<Object> lists) {
this.lists = lists;
} public Dog getDog() {
return dog;
} public void setDog(Dog dog) {
this.dog = dog;
}
}

通过@Value()来注入

@Value和@ConfigurationProperties的区别

比较 @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

配置文件yml还是properties他们都能获取到值;

只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

配置文件注入值数据校验

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person { //lastName必须是邮箱格式
@Email
private String lastName;
private Integer age;
private Boolean boss; private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;

@PropertySource | @ImportResource | @Bean

创建配置文件

创建person.properties配置文件并将application.properties配置文件中和person相关的配置清空

# 配置person文件
person.lats-name=person
person.age=18
person.birthday=2018/12/12
person.boy=false
person.maps.k1=岁月
person.maps.k2=yes
person.lists=1,2,3
person.dog.name=hi
person.dog.age=2

@PropertySource:加载指定的配置文件

package com.wangyang.springboot.people;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component; import javax.xml.crypto.Data;
import java.util.Date;
import java.util.List;
import java.util.Map; /**
* 将配置文件中的值映射到组件中
* @ConfigurationProperties 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix = "person" 配置文件中那个下面的所有属性进行配置
*
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
*
* @ConfigurationProperties(prefix = "person") 默认从全局配置文件中获取值
*/
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
public class Person { private String LatsName;
private Integer Age;
private boolean boy;
private Date birthday; private Map<String,Object> maps;
private List<Object> lists;
private Dog dog; @Override
public String toString() {
return "Person{" +
"LatsName='" + LatsName + '\'' +
", Age=" + Age +
", boy=" + boy +
", birthday=" + birthday +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
} public String getLatsName() {
return LatsName;
} public void setLatsName(String latsName) {
LatsName = latsName;
} public Integer getAge() {
return Age;
} public void setAge(Integer age) {
Age = age;
} public boolean isBoy() {
return boy;
} public void setBoy(boolean boy) {
this.boy = boy;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public Map<String, Object> getMaps() {
return maps;
} public void setMaps(Map<String, Object> maps) {
this.maps = maps;
} public List<Object> getLists() {
return lists;
} public void setLists(List<Object> lists) {
this.lists = lists;
} public Dog getDog() {
return dog;
} public void setDog(Dog dog) {
this.dog = dog;
}
}

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;

创建Spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="HelloService" class="com.wangyang.springboot.service.HelloService"></bean>
</beans>

创建一个新的组件

单元测试

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;

导入配置


package com.wangyang.springboot; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource; @ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class SpringBoot02ConfigApplication { public static void main(String[] args) {
SpringApplication.run(SpringBoot02ConfigApplication.class, args);
} }

SpringBoot推荐给容器中添加组件的方式: 全注解的方式

@Configuration: Spring配置文件

创建配置类

使用@Bean给容器中添加组件

package com.wangyang.springboot.config;

import com.wangyang.springboot.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @Configuration 指明当前类是一个配置类,就是来替代之前的Spring配置文件
*
* 在配置文件中用<bean></bean>标签添加组件
*/
@Configuration
public class MyAppConfig { @Bean
public HelloService helloService(){
System.out.println("配置类@Bean给容器中添加组件了");
return new HelloService();
}
}

不要忘记把之前在主入口导入的配置注释了

配置文件占位符

随机数

# 配置person文件
person.lats-name=hello${random.uuid}
person.age=${random.int}
person.birthday=2018/12/12
person.boy=false
person.maps.k1=岁月
person.maps.k2=yes
person.lists=1,2,3
person.dog.name=${person.lats-name}_hi
person.dog.age=2

属性配置占位符

占位符获取之前配置的值,如果没有可以是用:指定默认值

# 配置person文件
person.lats-name=hello${random.uuid}
person.age=${random.int}
person.birthday=2018/12/12
person.boy=false
person.maps.k1=岁月
person.maps.k2=yes
person.lists=1,2,3
person.dog.name=${person.latname:gg}_hi
person.dog.age=2

Profile

Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。

多profile文件

我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml

默认使用application.properties的配置;

创建多个配置文件

dev: 开发配置文件

prod: 生产配置文件

yml多文档块方式

通过文档块模式,并通过active来激活指定的配置

server:
port: 8081
spring:
profiles:
active: dev
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 80
spring:
profiles: prod

激活指定配置文件

  1. 在配置文件中指定
#激活dev的配置文件
application.propertie

  1. 命令行
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;

配置对应的命令参数或直接打包使用命令行运行如上





  1. 虚拟机参数
-Dspring.profiles.active=dev

配置文件加载位置

spring boot 启动会扫描application.properties或者application.yml文件作为Spring boot的默认配置文件。

– file:./config/
– file:./
– classpath:/config/
– classpath:/

以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。

我们也可以通过配置spring.config.location来改变默认配置

这时候我们可以自己动手新建一个项目来进行验证

外部配置的加载顺序

文档 | 外部配置

常用的外部配置

SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会

形成互补配置。

  1. 命令行参数(√)
#所有的配置都可以在命令行上进行指定,多个配置用空格分开。 --配置项=值
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
  1. 来自java:comp/env的JNDI属性
  2. Java系统属性(System.getProperties())
  3. 操作系统环境变量
  4. RandomValuePropertySource配置的random.*属性值

由jar包外向jar包内进行寻找,高优先级的配置覆盖低优先级的配置

**优先加载带profile**
6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件(√)
7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件(√) **再来加载不带profile**
8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件(√)
9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件(√)
  1. @Configuration注解类上的@PropertySource
  2. 通过SpringApplication.setDefaultProperties指定的默认属性

(√)为最常用的

自动配置原理

文档 | 可配置属性参照

1. 自动配置原理

  1. SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration
  2. @EnableAutoConfiguration作用:
    • 利用EnableAutoConfigurationImportSelector给容器中导入一些组件?
    • 可以查看selectImports()方法的内容;
    • List configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置

      将 类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中;
SpringFactoriesLoader.loadFactoryNames()
扫描所有jar包类路径下 META‐INF/spring.factories
把扫描到的这些文件的内容包装成properties对象
从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器

将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中;

每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置。

  1. 每一个自动配置类进行自动配置功能
  2. HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;
@Configuration //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties(HttpEncodingProperties.class) //启动指定类的
ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把
HttpEncodingProperties加入到ioc容器中 //根据当前不同的条件判断,决定这个配置类是否生效,一但这个配置类生效;这个配置类就会给容器中添加各种组件;
这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的; @ConditionalOnWebApplication //Spring底层@Conditional注解,根据不同的条件,如果
满足指定的条件,整个配置类里面的配置就会生效; 判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnClass(CharacterEncodingFilter.class) //判断当前项目有没有这个类
CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing =
true) //判断配置文件中是否存在某个配置 spring.http.encoding.enabled;如果不存在,判断也是成立的
//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的; public class HttpEncodingAutoConfiguration {
//他已经和SpringBoot的配置文件映射了
private final HttpEncodingProperties properties;
//只有一个有参构造器的情况下,参数的值就会从容器中拿
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}
@Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取
@ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件?
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
  1. 所有在配置文件中能配置的属性都是在xxxxProperties类中封装者

配置文件能配置什么就可以参照某个功能对应的这个属性类

@ConfigurationProperties(prefix = "spring.http.encoding") //从配置文件中获取指定的值和bean的属
性进行绑定
public class HttpEncodingProperties {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF‐8");

精髓

  1. SpringBoot启动会加载大量的自动配置类
  2. 我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;
  3. 我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
  4. 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这

    些属性的值;

xxxxAutoConfigurartion:自动配置类;给容器中添加组件

xxxxProperties:封装配置文件中相关属性;

2. 细节

  1. @Conditional派生注解

作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

@Conditional扩展注解 作用(判断是否满足当前指定条件)
@ConditionalOnJava 系统的java版本是否符合要求
@ConditionalOnBean 容器中存在指定Bean;
@ConditionalOnMissingBean 容器中不存在指定Bean;
@ConditionalOnExpression 满足SpEL表达式指定
@ConditionalOnClass 系统中有指定的类
@ConditionalOnMissingClass 系统中没有指定的类
@ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty 系统中指定的属性是否有指定的值
@ConditionalOnResource 类路径下是否存在指定资源文件
@ConditionalOnWebApplication 当前是web环境
@ConditionalOnNotWebApplication 当前不是web环境
@ConditionalOnJndi JNDI存在指定项

自动配置类必须在一定的条件下才能生效

我们可以通过启用debug=true属性,来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效。

=========================
AUTO-CONFIGURATION REPORT
========================= Positive matches:(自动配置类启用的)
----------------- DispatcherServletAutoConfiguration matched:
- @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
- @ConditionalOnWebApplication (required) found StandardServletEnvironment (OnWebApplicationCondition) Negative matches:(没有启动,没有匹配成功的自动配置类)
----------------- ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition) AopAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required classes 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice' (OnClassCondition)

SpringBoot——配置文件详解【五】的更多相关文章

  1. SpringBoot 配置文件详解

    springboot采纳了建立生产就绪spring应用程序的观点. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.在一般情况下,我们不需要做太多的配置就能够让spring boot正 ...

  2. MongoDB之conf配置文件详解(五)

    详细看一下mongodb配置文件. mongodb.conf # mongodb.conf # 数据库文件位置 dbpath=/var/lib/mongodb #日志文件的路径 logpath=/va ...

  3. SpringBoot配置文件详解

    自定义属性与加载 com.dongk.selfproperty.title=wangdkcom.dongk.selfproperty.name=10000 然后通过@Value("${属性名 ...

  4. Spring Boot2 系列教程 (五) | yaml 配置文件详解

    自定义属性加载 首先构建 SpringBoot 项目,不会的看这篇旧文 使用 IDEA 构建 Spring Boot 工程. 首先在项目根目录 src >> resource >&g ...

  5. (转) SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解

    springboot采纳了建立生产就绪spring应用程序的观点. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.在一般情况下,我们不需要做太多的配置就能够让spring boot正 ...

  6. SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot2-config-file/ 本文出自方志朋的博客 ...

  7. springboot项目--传入参数校验-----SpringBoot开发详解(五)--Controller接收参数以及参数校验----https://blog.csdn.net/qq_31001665/article/details/71075743

    https://blog.csdn.net/qq_31001665/article/details/71075743 springboot项目--传入参数校验-----SpringBoot开发详解(五 ...

  8. Spring Boot 配置文件详解

    Spring Boot配置文件详解 Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件.他们的作用都是修改Spring Boot自动配置的默认值.相对于prop ...

  9. quartz配置文件详解

    quartz配置文件详解(转载)     quartz学习总结: 一.关于job:    用Quartz的行话讲,作业是一个执行任务的简单Java类.任务可以是任何Java代码.只需你实现org.qu ...

随机推荐

  1. [LeetCode] 289. Game of Life 生命游戏

    According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellul ...

  2. [LeetCode] 285. Inorder Successor in BST 二叉搜索树中的中序后继节点

    Given a binary search tree and a node in it, find the in-order successor of that node in the BST. Th ...

  3. [LeetCode] 215. Kth Largest Element in an Array 数组中第k大的数字

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  4. 第09组 Beta冲刺(4/5)

    队名:观光队 链接 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 学习 展示GitHub当日代码/文档签入记录 无 接下来的计划 完成短租车,页面美化 还剩下哪些任 ...

  5. Mac上Hive安装配置

    Mac上Hive安装配置 1.安装 下载hive,地址:http://mirror.bit.edu.cn/apache/hive/ 之前我配置了集群,tjt01.tjt02.tjt03,这里hive安 ...

  6. 首次体验MangoDB

    Author:SimpleWu MongoDB官方网:https://www.mongodb.com/ MongoDB中文网:http://www.mongodb.org.cn/ 什么是MongoDB ...

  7. leetcode 903. DI序列的有效排列

    题目描述: 我们给出 S,一个源于 {'D', 'I'} 的长度为 n 的字符串 .(这些字母代表 “减少” 和 “增加”.)有效排列 是对整数 {0, 1, ..., n} 的一个排列 P[0], ...

  8. 外文投稿时应该如何填写有关Social Media的问题?

    外文投稿时应该如何填写有关Social Media的问题? 1 *Please supply our social media editor with a "tweet" or s ...

  9. No package python-pip available. 解决方法

    问题描述: No package python-pip available. 解决办法: rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/ep ...

  10. cmd命令和linux命令的区别

    cmd命令和linux命令看起来很相似,都是在一个控制台输入一些特定的指令去完成一些特定的操作.可是用过的朋友就会发现这些指令是有很多不同的,可是到底有什么不同,要说又说不上来,所以要了解一下. cm ...