当前位置:首页 » 存储配置 » 哪个组件的配置项优先级最高

哪个组件的配置项优先级最高

发布时间: 2023-02-21 02:57:07

1. SpringBoot项目结构及功能

在IntelliJ使用 Spring Initializer快速创建项目

这是pom文件中父项目,再进一步查看其 spring-boot-starter-parent

发现真正管理Spring Boot应用里面的所有依赖版本的地方在这 spring-boot-dependencies
Spring Boot的版本仲裁中心;
以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖自然需要声明版本号)
再往下看:

这是spring boot的web场景启动器,只要引入了它,就能帮我们导入了web模块正常运行所依赖的组件;

@SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;

@SpringBootConfiguration:Spring Boot的配置类:标注在某个类上,表示这是一个Spring Boot的配置类;
@Configuration:配置类上来标注这个注解;
配置类 ----- 配置文件;配置类也是容器中的一个组件;@Component

@EnableAutoConfiguration:开启自动配置功能;
以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效;

在src下创建一个controller包,新建一个HelloController类,之后运行springboot,便可以通过 localhost:/8080/hello 来访问hello页面。

SpringBoot使用一个全局的配置文件,配置文件名是固定的;
• application.properties
• application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;

application.yml

@Value获取值和@ConfigurationProperties获取值比较
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
==我们还可以通过spring.config.location来改变默认的配置文件位置==
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

2. spring boot 使用 k8s 的 configMap 作为外部配置

spring boot 应用以容器的方式运行在 k8s 集群上面是非常方便的,但是不同的环境需要不同的配置文件,我们可以使用外部的配置中心,比如 nacos 、 apollo 。 k8s 也提供了 configMap 用来将环境配置信息和容器镜像解耦,便于应用配置的修改。本文主要从以下几个方面介绍 spring boot 使用 k8s 的 configMap 作为外部配置的使用方法:

当应用程序启动时,Spring Boot 会自动从以下位置查找并加载 application.properties 和 application.yaml 文件。

配置文件优先级从高到底的顺序如下:

高优先级配置会覆盖低优先级配置

如果我们运行时想指定运行哪个环境的配置文件,可以有三种方式:

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时 pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

创建 configMap 的几种方式:

从前面的介绍我们可以知道,spring boot 加载配置文件的最高优先级是 项目根路径下的 /config 子目录 ,所以可以将 configMap 中的配置文件挂载到容器中的项目根路径下的 config 子目录中。

当卷中使用的 configMap 被更新时,所投射的键最终也会被更新。 kubelet 组件会在每次周期性同步时检查所挂载的 configMap 是否为最新。 不过,kubelet 使用的是其本地的高速缓存来获得 configMap 的当前值。 高速缓存的类型可以通过 KubeletConfiguration 结构 的 字段来配置。

configMap 既可以通过 watch 操作实现内容传播(默认形式),也可实现基于 TTL 的缓存,还可以直接经过所有请求重定向到 API 服务器。 因此,从 configMap 被更新的那一刻算起,到新的主键被投射到 Pod 中去,这一 时间跨度可能与 kubelet 的同步周期加上高速缓存的传播延迟相等。 这里的传播延迟取决于所选的高速缓存类型 (分别对应 watch 操作的传播延迟、高速缓存的 TTL 时长或者 0)。

以环境变量方式使用的 configMap 数据不会被自动更新,更新这些数据需要重新启动 Pod。

参考文档:

k8s 官网

spring boot 官网

3. 2021-11-22 spring-cloud-nacos配置优先级

最近有项目组同学问到为什么自己配置了nacos,但配置不生效?我简单看了下,发现问题出在相关配置的优先级模式不同。
spring-boot项目,有bootstrap、application两个配置文件,结合profile,和支持的文件格式properties、yaml,已经有6个配置文件了。然后使用了spring-cloud-starter-alibaba-nacos-config 后,又提供了三级配置。这些配置之间的组合关系,将在无形中影响配置的效果。很多同学只知道其中的一种,因此在无意识引入两种或以上的配置后,就会发现有奇怪的配置不生效问题发生。

spring-boot项目依赖bootstrap.yml 用于应用程序上下文的引导阶段,由父Spring ApplicationContext加载,其工作的阶段为父ApplicationContext 被加载到使用application.yml的之前。也就是说 bootstrap 加载优先于 applicaton。

bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

bootstrap 配置文件有以下几个应用场景:

由于spring-boot支持多种文件格式,所以多种格式之间,其优先级是平等的,只要找到了一个,就会被使用。一般有:.properties、.yaml、.xml等格式。

应用级别的spring-boot配置文件,主要用于 Spring Boot 项目的自动化配置,其加载优先级低于bootstrap.yaml。

nacos作为外部配置服务器,通过spring-boot的bootstrap.yaml引入。但nacos本身,也提供了三级配置体系:主配置(只有一个,但会按照不同后缀名,去找到相关配置)、扩展配置、共享配置。

三级配置的优先级如下:主配置 > 扩展配置 > 共享配置

nacos提供的配置路径 spring.cloud.nacos.config 下,有一系列的属性用于定位主配置。基于 prefix(默认为 ${spring.application.name} 的值)、namespace、group(默认为字符串 DEFAULT_GROUP )、file-extension(默认为字符串 .properties ),按组装规则 ${prefix}-${spring.profiles.active}.${file-extension} 去找到一个配置。

在nacos的所有配置中,主配置(存在的情况下)具有最高的优先级,其同名配置值不能被扩展配置或共享配置中定义的同名属性所覆盖。

上述两类配置都支持三个属性: data-id 、 group (默认为字符串 DEFAULT_GROUP )、 refresh (默认为 true )。

实际上,nacos中并未对 extension-configs 和 shared-configs 的差别进行详细阐述。我们从他们的结构,看不出本质差别;除了优先级不同以外,也没有其他差别。那么,nacos项目组为什么要引入两个类似的配置呢?我们可以从当初 该功能的需求(issue) 上找到其原始目的。
摘要其核心内容如下:

4. SpringBoot 配置文件详解(告别XML)

快速学会和掌握 SpringBoot 的 核心配置文件的使用。

SpringBoot 提供了丰富的 外部配置 ,常见的有:

其中核心配置文件我们并不陌生,主要以Key-Value的形式进行配置,其中属性Key主要分为两种:

在 application.properties 添加配置如下:

① 添加数据源信息

在 application.propertis 添加配置如下:

① 添加认证信息,其中 socks.indentity.* 是自定义的属性前缀。

② 添加随机值,其中spring.test.* 是自定义的属性前缀。

使用方法: @ConfigurationProperties(prefix = "spring.datasource")

使用说明:提供 Setter方法 和 标记组件 Component

如何验证是否成功读取配置?答:这里可以简单做个验证,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:

使用方法: @Value("spring.datasource.*")

使用说明:提供 Setter方法 和 标记组件 Component

注意事项:@Value不支持注入静态变量,可间接通过Setter注入来实现。

关于两者的简单功能对比:

显然,前者支持松绑定的特性更强大,所以在实际开发中建议使用@ConfigurationProperties来读取自定义属性。

SpringBoot 默认会加载这些路径加载核心配置文件,按优先级从高到低进行排列:具体规则详见 ConfigFileApplicationListener

如果存在多个配置文件,则严格按照优先级进行覆盖,最高者胜出:

举个简单的例子,例如再上述位置都有一个application.properties ,并且每个文件都写入了server.port=xx (xx分别是9001,9002,9003,9004),在启动成功之后,最终应用的端口为:9004。图例:

如果想修改默认的加载路径 或者 调改默认的配置文件名,我们可以借助命令行参数进行指定,例如:

YAML是JSON的一个超集,是一种可轻松定义层次结构的数据格式。

答: 因为配置文件这东西,结构化越早接触越规范越好。这里推荐阅读阮一峰老师写的 YAML语言教程 ,写的很简单明了。

引入依赖: 在POM文件引入 snakeyaml 的依赖。

使用说明: 直接在类路径添加 application.yml 即可。

例如下面这两段配置是完全等价的:

① 在 application.yml 配置数据源:

② 在 application.properties 配置数据源:

在项目的实际开发中,我们往往需要根据不同的环境来加载不同的配置文件。例如生产环境,测试环境和开发环境等。此时,我们可以借助 Profiles 来指定加载哪些配置文件。例如:

温馨提示:如果spring.profiles.active指定了多个配置文件,则按顺序加载,其中最后的优先级最高,也就是最后的会覆盖前者。

使用方法:
使用Maven插件打包好项目,然后在当前路径,执行DOS命令: java -jar demo.jar --server.port=8081 ,在控制台可看到应用端口变成了8081。

实现原理:
默认情况下,SpringBoot会将这些命令行参数转化成一个 Property ,并将其添加到 Environment 上下文。

温馨提示:
由于命令行参数优先级非常之高,基本高于所有常见的外部配置,所以使用的时候要谨慎。详见 PropertySource 执行顺序 。

关闭方法:
如果想禁用命令行属性,可以设置如下操作:springApplication.setAddCommandLineProperties(false)

5. 10 . DHCP作用域有三个层次,哪个作用域选项优先级最高 (4 分)

C

A为所有作用域
B为指定的作用域
C为预约

6. 二、springboot配置文件

1. 配置文件

Spring Boot使用一个全局的配置文件

application.properties

application.yml

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

配置好。有什么配置项,可以移步官方文档

配置文件一般放在src/main/resources目录或者类路径/confifig下,当然还有很多位置可

以放,它们会有不同优先级,后面会讲到。

YAML (YAML Ain't Markup Language)

简单介绍

<!--绑定配置文件处理器,配置文件进行绑定的时候就会有提示-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-configuration-processor</artifactId>

<optional>true</optional>

</dependency>

<!-- 将应用打包成一个可执行Jar包,直接使用java -jar xxxx的命令来执行 -->

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>以前的配置文件:大多是xml

.yml是YAML语言的文件,以数据为中 心,比json、xml等更适合做配置文件

全局配置文件的可以对一些默认配置值进行修改

配置实例

xml:

yml:

2. YAML语法

基本语法

K:(空格)V 标识一对键值对

以空格的缩进来控制层级关系

只要是左对齐的一列数据,都是同一层级的

属性和值也是大小写敏感

实例:

值的写法

普通的值

k: v 字面量直接来写,字符串默认不用添加单引号

" " 双引号 不会转义字符串里面的特殊字符;

<server>

<port>8081</port>

</server>

server:

port: 8081

server:

port: 8081

path: /hello // 冒号后面的空格不要拉下' ' 单引号 会转义字符,特殊字符最终是一个普通的字符串

对象

普通写法:

行内写法

frends:{ lastName: zhang,age: 18 }

Map

示例:

maps: {k1: v1,k2: v2}

数组

普通写法:

pets: // var onj = {pets: ['cat','pig','dog']}

- cat

- pig

- dog

行内写法

pets:[cat, pig, dog]

配置文件获取

将配置文件中的每一个值映射到此组件中

1. Persion

name: "wang \n qian" // 输出:wang 换行 qian

frends:

lastName: zhang

age: 20package com.wrq.boot.bean;

@Component

@ConfigurationProperties(prefix = "persion")

public class Persion {

private String name;

private int age;

private double weight;

private boolean boss;

private Date birth;

private Map<String,Object> maps;

private List<Object> list;

private Dog dog;

此处,这个bean的getter、setter和tostring方法已经省略,千万不能忽略!

}

@ConfifigurationProperties 意思是:我们类里面的属性和配置文件中的属性做绑定

不使用此注解,可以在bean的属性添加@value()注解,如下:

@Component

// @ConfigurationProperties(prefix = "persion")

public class Persion {

@value("${persion.name}") // $()读取配置文件、环境变量中的值

private String name;

@value("#{11*2}") // #{SpEL} 采用表达式

private int age;

@value("true") // 直接赋值

private boolean boos;

}

此处采用@ConfifigurationProperties的方式,@value()和@ConfifigurationProperties的

区别见下方表格。prefifix = "persion" 配置文件中那个下面的属性来一一映射

@Component 如果想要这个注解起作用,必须放到容器里面

2. Dog

package com.wrq.boot.bean;

public class Dog { // 用作Persion中的属性

private String name;

private int age;

此处,这个bean的getter、setter和tostring方法已经省略,千万不能忽略!

}

3. 配置文件

方式一: application.yml

persion:

name: 王大锤

age: 18

weight: 125

boss: false

birth: 2018/5/5

maps: {k1: v1,k2: v2}

list:

- wangli

- wang

dog:

name: xiaogou

age: 2

方式二: application.propertiespersion.name = 王大锤

persion.age = 18

persion.weight = 125

persion.boss = false

persion.birth = 2018/5/5

persion.maps.k1 = v1

persion.maps.k2 = v2

persion.dog.name = xiaogou

persion.dog.age = 15

4. 测试类:BootApplicationTests

package com.wrq.boot;

@RunWith(SpringRunner.class)

@SpringBootTest

public class BootApplicationTests {

@Autowired

Persion persion;

@Test

public void contextLoads() {

System.out.print(persion);

}

}

5. 运行 BootApplicationTests方法

控制台打印:

application.yml的结果:

Persion{name='王大锤', age=18, weight=125.0, boss=false, birth=Sat May

05 00:00:00 CST 2018, maps={k1=v1, k2=v2}, list=[wangli, wang],

dog=Dog{name='xiaogou', age=2}}

application.properties的结果:

Persion{name='��Ǭ', age=18, weight=125.0, boss=false, birth=Sat

May 05 00:00:00 CST 2018, maps={k2=v2, k1=v1}, list=[wangli, wang],

dog=Dog{name='xiaogou', age=15}}

把Bean中的属性和配置文件绑定,通过yml文件和properties都可以做到,但是properties

文件出现乱码。

properties中文读取乱码:File->Settings->File Encodings最底部选utf-8、Tranparent打

上勾

注解比较

@value和@ConfifigurationProperties获取值比较

名词解释:

松散绑定

last-name和lastName都可以获取导致,则代表支持松散绑定

JSR303@Component

@ConfigurationProperties(prefix = "persion") // 如果使用的是@value注入值

时,无法使用校验

@Validated // 添加此注解

public class Persion {

@Email // 配置文件书写的属性必须是邮箱格式,不符合报错!

private String name;

}

复杂类型封装

如果获取配置文件中map的值时,@value是获取不到值的

@value("${persion.maps}") // 由于使用的是@value,无法获取配置文件中的map

private Map<String,Object> maps;

@PropertySource

@PropertySource:加载指定配置文件

@ConfifigurationProperties()默认是从全局配置文件中获取值,也就是

application.properties这个文件中获取值。

如果做的配置很多,全局的配置文件就会特别大,为了方便管理。我会创建不同的配置文

件定向管理不同的配置。

如创建persion.properties文件单独存放persion需要的配置

@PropertySource就是用来导入创建的配置文件

示例:

1. persion.properties

同时把两个全局的配置中关于Persion的配置都注释掉persion.name = 王弟弟

persion.age = 18

persion.weight = 125

persion.boss = false

persion.birth = 2018/5/5

persion.maps.k1 = v1

persion.maps.k2 = v2

persion.dog.name = xiaogou

persion.dog.age = 15

2. Persion

package com.wrq.boot.bean;

@Component

@PropertySource(value = {"classpath:persion.properties"})

@ConfigurationProperties(prefix = "persion")

public class Persion {

private String name;

private int age;

private double weight;

private boolean boss;

private Date birth;

private Map<String,Object> maps;

private List<Object> list;

private Dog dog;

此处,这个bean的getter、setter和tostring方法已经省略,千万不能忽略!

}

这样运行测试类,控制台就可以打印persion.properties中的数据。

通过下面的注解,把类路径下的persion.properties加载进来。并且把persion开头的数

据进行绑定。

@PropertySource(value = {"classpath:persion.properties"})@ConfifigurationProperties(prefifix = "persion")

@ImportResource

@ImportResource:导入Spring的配置文件,让配置文件生效。

示例:

1. com.wrq.boot.service

package com.wrq.boot.service;

/**

* Created by wangqian on 2019/1/12.

*/

public class HelloService {

}

2. resources目录手动建立bean.xml

<?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.wrq.boot.service.HelloService">

</bean>

</beans>

3. 测试类

package com.wrq.boot;

@RunWith(SpringRunner.class)

@SpringBootTest

public class BootApplicationTests {

@Autowired

ApplicationContext ioc;@Test

public void testConfig() {

boolean b = ioc.containsBean("helloService");

System.out.print(b);

}

}

试图通过添加一个Spring的配置文件bean.xml来把HelloService注入进去。

运行测试类结果:false

结果表明IoC容器中并不包含HelloService,即:配置文件bean.xml没有生效

解决方式

方式一: 主程序中进行配置@ImportResouece注解

package com.wrq.boot;

@ImportResource(locations = {"classpath:bean.xml"}) // 通过此配置是

bean.xml生效

@SpringBootApplication

public class BootApplication {

public static void main(String[] args) {

//应用启动起来

SpringApplication.run(BootApplication.class, args);

}

}

方法二:通过配置类实现,这种方式也是Spring Boot推荐的

1. com.wrq.boot.confifigpackage com.wrq.boot.config;

/**

* Created by wangqian on 2019/1/12.

*/

@Configuration

public class MyConfig {

// 将方法的返回值添加到容器之中,并且容器中这个组件的id就是方法名

@Bean

public HelloService helloService(){

System.out.print("通过@Bean给容器添加组件了..");

return new HelloService();

}

}

@Confifiguration标注这是一个配置类

通过@Bean注解,将方法的返回值添加到容器之中,并且容器中这个组件的id就是方

法名

2. 把主程序类中@ImportResource()配置注释掉

3. 测试成功,添加了HelloService()组件

3. 配置文件占位符

随机数

RandomValuePropertySource:配置文件中可以使用随机数

${random.value}

${random.int}

${random.long}

${random.uuid}

${random.int(10)}

${random.int[1024,65536]}

属性配置占位符可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)

${app.name:默认值}来指定找不到属性时的默认值

persion.name = 王弟弟${random.uuid}

persion.age = ${random.int}

persion.dog.name = ${persion.name}_dog

4. Profifile 多环境支持

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

快速切换环境

1. 多Profifile的方式

格式:application-{profifile}.properties/yml

application-dev.properties

application-prod.properties

默认采用application.properties配置文件,如果使用别的,需要激活:

1. application.properties中配置:

# 激活application-dev.properties配置文件

spring.profiles.active=dev

2. application-dev.properties:

server.port=8082

3. 运行BootApplication主程序:

2019-01-12 20:46:09.345 INFO 14404 --- [main]

s.b.c.e.t. : Tomcat started on port(s):

8082 (http)

2. 多文档块的方式

除了上方多Profifile的方式来切换环境,也可以通过YAML多文档块的方式。示例:

application.yml:

server:

port: 8081

spring:

profiles:

active: dev

---

spring:

profiles: dev

server:

port: 8083

---

spring:

profiles: prod

server:

port: 8084

3. 激活指定Profifile

1. application.properties中配置:

# 激活application-dev.properties配置文件

spring.profiles.active=dev

2. application.yml中配置

server:

port: 8081

spring:

profiles:

active: dev

---

spring:

profiles: dev

server:

port: 80833. 启动配置-参数

在IDE中,类似于配置tomcat的地方,按下方配置:

Program arguments:--spring.profiles.active=dev

4. 启动配置-虚拟机

在IDE中,类似于配置tomcat的地方,按下方配置:

VM options:-Dspring-profiles-active=dev

5. 命令行 使用Maven的package命令打包,移动到jar的目录。

java -jar spring-boot-project-config.jar --spring.profiles.active=dev

5. 配置文件优先级

GitHub对应项目:boot-confifig-position

优先级

Spring Boot 启动会扫描以下位置的application.properties或者 application.yml文件作

为Spring boot的默认配置文件

fifile:./confifig/ (项目根目录confifig文件夹下的配置文件)

fifile:./ (项目根目下的配置文件)

classpath:/confifig/ (resources目录confifig文件夹下的配置文件)

classpath:/ (resources目下的配置文件)

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

盖低优先级配置内容,形成互补配置。

默认配置

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

项目打包后以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新

位置;指定配置文件和默认加载的这些配置文件共同起作用,形成互补配置。

1. Maven->package对项目打包2. 把待使用的配置文件放在本地文件夹中,如:D:/application.properties

3. 命令行执行命令

java -jar boot-config-position-xxxxxx.jar --

spring.config.location=D:/application.properties

这样即使项目上线了,我们也可以通过修改本地的配置文件,使用一行命令即可,极大方

便了运维人员。

6. 外部配置加载顺序

Spring Boot 支持多种外部配置方式

可以从以下位置加载配置,优先级从高到低,高优先级配置覆盖低优先级的,所以配置形

成互补配置。

1. 命令行参数

java -jar boot-config-position-xxxxxx.jar --server.port // 多个配置用空格

隔开

2. 来自java:comp/env的JNDI属性

3. Java系统属性(System.getProperties())

4. 操作系统环境变量

5. RandomValuePropertySource配置的random.*属性值

6. jar包外部的application-{profifile}.properties或application.yml(带spring.profifile)配

置文件

7. jar包内部的application-{profifile}.properties或application.yml(带spring.profifile)配

置文件

8. jar包外部的application.properties或application.yml(不带spring.profifile)配置文件

9. jar包内部的application.properties或application.yml(不带spring.profifile)配置文件

10. @Confifiguration注解类上的@PropertySource

11. 通过SpringApplication.setDefaultProperties指定的默认属性

注意:从jar包外向jar包内寻找,优先加载profifile最后加载不带profifile,更多参考官方文



7. 自动配置原理GitHub对应项目:boot-confifig-autoconfifig

1. 配置文件写什么?

配置文件可配置属性查阅

2. 什么是注解,如何实现一个注解?

关于注解的机制和相关原理可以移步此篇博客

3. 配置原理解析

我们运行Spring Boot应用是从main方法启动,在主程序类上有一个

@SpringBootApplication注解。

@SpringBootApplication是一个复合注解,包括@ComponentScan,和

@SpringBootConfifiguration,@EnableAutoConfifiguration。

@SpringBootConfifiguration继承自@Confifiguration,二者功能也一致,标注当前类

是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到

srping容器中,并且实例名就是方法名。

@EnableAutoConfifiguration的作用启动自动的配置,@EnableAutoConfifiguration注

解的意思就是SpringBoot根据你添加的jar包来配置你项目的默认配置,比如根据

spring-boot-starter-web ,来判断你的项目是否需要添加了webmvc和tomcat,就

会自动的帮你配置web项目中所需要的默认配置

@ComponentScan,扫描当前包及其子包下被@Component,@Controller,

@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的co

ntext:component-scan(以前使用在xml中使用的标签,用来扫描包配置的平行支

持)。

@SpringBootApplication注解分析

配置原理视频讲解

4. 自动配置类判断

在配置文件properties中设置:debug=true 来让控制台打印自动配置报告,方便的得知

那些配置类生效。

=========================

AUTO-CONFIGURATION REPORT

=========================Positive matches:

-----------------

matched:

- @ConditionalOnClass found required class

'org.springframework.web.servlet.DispatcherServlet';

@ConditionalOnMissingClass did not find unwanted class

(OnClassCondition)

- @ConditionalOnWebApplication (required) found 'session' scope

(OnWebApplicationCondition)

Negative matches:

-----------------

ActiveMQAutoConfiguration:

Did not match:

- @ConditionalOnClass did not find required classes

'javax.jms.ConnectionFactory',

'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)

7. 为什么xml配置的优先级大于注解配置的优先级大于java源代码的优先级长

注解配置一般指诸如开放源代码的对象框架,如Spring(开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题)、Hibernate(对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架)在使用这个框架的之前要进行相应的配置。配置的方式有三种,xml配置,注解配置(Java注解配置),java配置(Java代码配置)。关于注解配置和Java配置的区别,此处附上大牛的详细解答(https://blog.csdn.net/rendong/article/details/54566027)目前关于三种配置的优先级没有明确而统一的说法,况且编译器以及编译环境的差异,产生的结果差距较大,不可轻易下定结论。但有大牛做了实验,总结出如下结论:“xml配置与注解配置都执行,默认顺序谁先加载谁先执行,指定执行顺序 添加order参数 建议: 应该先执行xml 后 执行注解 xml 配置的是统一的。但是可能我想在具体的方法里搞特殊,就自己加注解 例如xml配置了REQUIRED回滚 而我的具体的方法不想回滚但是还要用insert开头,就可以在注解配置。详细过程附上原文链接:https://blog.csdn.net/xclltssun/article/details/80959563”至于Java源代码优先级最后的原因也很清楚了,前面第一个链接力讲的很清楚,我简单讲下:使用注解的方式,那么你需要在Serivce层,DAO层的时候,需要在类上进行注解,才可获得spring的依赖注入;如果使用java配置的方式,那么就不需要在类上写注解了,直接在配置类里面进行申明即可。Java源代码配置是写在类里面的,而注解配置是在类上进行注解,这就相当于一个在房门上,一个在房间里的桌子上,如果有人来拜访坐在房间里面的主人自然应该先敲门。注解配置就是那一扇门。本着默认顺序——先加载先执行的原则,自然在优先级上表现为xml配置>注解配置>Java源代码配置但实际上,我海还是没有找到关于此方面优先级明确的定义。

8. 3.Config核心功能和原理

Config作为Spring Cloud官方指定产品,在配置管理方面主要提供了三个功能

经过前面几个组件的源码阅读锻炼,相信同学们读起Config来已经不在话下了,作为配置中心的服务端,拉取参数三步走:

如果大家在application.yml中定义了一个属性test,并使用占位符${remoteTest}作为test属性的值,当我们在Config Server中配置remoteTest属性后,你会发现在项目完成启动的时候,Config Server中的remoteTest被注入到了配置文件中的test属性。从这个现象我们可以得出一个结论,应用程序一定是在Spring上下文初始化的早期阶段就从Config Server获取了配置文件,这个过程优先于本地配置项的加载过程。

P.S. 关于文件加载顺序在这里多提一句,bootstrap.yml文件在所有文件以前加载,所以Config的配置我们会放在bootstrap.yml中。然后application.properties的加载优先级比application.yml文件高。

我们来看看应用的初始化方式:

SpringCloud应用同时也是一个SpringBoot应用,因此整个应用的初始化从SpringBoot启动时的上下文Context构建开始:

和所有的SpringBoot项目一样,通过SpringApplication类的run方法开始启动项目初始化和加载流程,其中就包括prepareContext这一步,整个项目的上下文结构就通过这个方法来构建

这是一连串的初始化构造过程,当我们在项目中引入了SpringCloud依赖时,将作为一个初始化构造器,参与SpringBoot上下文的初始化,用来加载SpringCloud的属性资源

是通过一系列的locator来定位资源文件的,当我们在项目中引入springcloud-config-client的依赖以后,就会开启Config组件的自动装配(由实现),在这个自动装配过程中会向locator列表里添加一个专门用来获取远程文件的类-

定义了执行顺序的优先级是0(通过@Order(0)注解定义),在Spring中这个数字越小则表示优先级越高,因此,这个组件将优先于其他locator先被执行。通过getRemoteEnvironment方法,向Config Server发起请求,获取远程属性

9. 在web服务搭建中优先级最高的默认文档是什么

Web服务器的配置与管理

理论基础

一、Web服务器的基本概念

World Wide Web(也称Web、WWW或万维网)是Internet上集文本、声音、动画、视频等多种媒体信息于一身的信息服务系统,整个系统由Web服务器、浏览器(Browser)及通信协议等3部分组成。WWW采用的通信协议是超文本传输协议(HTTP,Hyper Text Transfer Protocol),它可以传输任意类型的数据对象,是Internet发布多媒体信息的主要协议。

WWW中的信息资源主要由一篇篇的网页为基本元素构成,所有网页采用超文本标记语言HTML(Hyper Text Markup Language)来编写,即可以含有指向其他Web页或其本身内部特定位置的超级链接,简称链接。可以将链接理解为指向其它Web页的“指针”。链接使得Web页交织网状。这样,如果Internet上的Web页和链接非常多的话,就构成了一个巨大的信息网。当用户从WWW服务器取到一个文件后,用户需要在自己的屏幕上将它正确无误地显示出来HTML文档本身是文本格式的,用任何一种文本编辑器都有可以对它进行编辑。HTML语言HTML语言的语法,专门提供给专业人员用来创建Web文档,一般用户并不需要掌握它。Internet中的网站成千上万。为了准确查找。人们采用了统一资源定位器URL(Uniform Resource Locator)来在全世界唯一标识某个网络资源。其描述格式为:

协议://主机名称/路径名/文件名:端口号

例如:客户程序首先看到http(超文本传输协议),知道处理的是HTML连接,接下来的是站点地址(对应一个特定的IP地址),其中www是主机名称,是域名。至于http协议默认使用的TCP协议端口为80,可省略不写。如果另外指定端口号就需要在URL后面添加上端口号,例如::24。补充:其实,直接输入与URL相对应的IP地址也可以找到相应的站点。只是IP地址不直观,不便于记忆。关于URL和IP地址的转换问题,我们将在DNS服务器那节中再给大家进行详细的讲解。

实训内容

一、实训环境

两台主机与交换机相连。WEB服务器为windows 2000 server及更高版本操作系统,客户机为WINDOW系列(如windows 2000 professional)操作系统;

本实训两人为一组,一人负责使用服务器,另一人负责在验证机上验证测试WWW站点;

两台装有Windows 2000 Server操作系统的电脑。一台作为WWW服务器,另一台作为WWW测试机。一张Windows 2000 Server系统的安装光盘。

二、实训要求

1、理解WWW服务器的体系结构与工作原理;

2、掌握利用Microsoft的IIS实现WWW服务的基本配置;

3、掌握虚拟目录的配置;

4、能熟练地配置与管理WWW服务器。

三、实训步骤

(一)IIS的安装

1、在Windows 2000中推出了Internet Information Server (简称IIS)提供了方便的安装和管理。因此,在配置与管理WWW服务器之前,我们应先安装IIS。打开“控制面板”中的“添加或删除程序”,选择“添加/删除Windows组件”按钮。

2、在出现“组件安装向导”中,选择“Internet信息服务(IIS)”,再选择“详细信息”,在弹出的对话框中,我们必须要保证“World Wide Web 服务器”选项是被选中的。如下图所示:

3、点“确定”按钮返回“Windows 组件向导”对话框。再点“下一步”按钮,即进入了WWW服务器安装过程。如下图片所示:

4、系统将自动安装WWW,点“完成”按钮后,WWW便安装成功了。此时我们打开“开始”菜单——“程序”——“管理工具”——“Internet服务器管理器”选项后,我们将看到在“Internet信息服务”选项中多了两个选项:“默认Web站点”和“管理Web站点”选项,并已自动启动。

热点内容
凯迪拉克ct6电磁悬挂是哪个配置 发布:2025-07-12 23:24:38 浏览:596
linuxnginx重启 发布:2025-07-12 23:11:00 浏览:803
电脑检查服务器 发布:2025-07-12 23:10:59 浏览:606
php缺口 发布:2025-07-12 22:48:58 浏览:555
具有加密地址 发布:2025-07-12 22:38:39 浏览:157
弧AC3算法 发布:2025-07-12 22:37:51 浏览:491
电脑服务器连接财务软件 发布:2025-07-12 22:15:16 浏览:355
安卓如何用应用的通讯录 发布:2025-07-12 22:15:01 浏览:668
墨西哥访问 发布:2025-07-12 22:14:11 浏览:682
排解压力的经历 发布:2025-07-12 21:58:43 浏览:96