SpringBoot学习笔记(二)配置文件介绍 及 自动配置原理简介

系列文章目录

SpringBoot入門學習(一)创建与发布
SpringBoot入门学习笔记(二)配置文件介绍 及 自动配置原理简介

SpringBoot入门学习笔记(三)日志


配置文件

SpringBoot使用一个全局的配置文件,配置文件名固定为 application.propertiesapplication.yml。用于修改SpringBoot配置的默认值。
关于区别:

  1. yml为树型结构,properties需要写全,并以点分割
  2. 正常的优先加载yml文件,若同时存在yml与properties则最终以properties文件为准。

yml语法

  1. K : V 表示键值对(注意冒号前后有空格)
  2. 以空格的缩进来控制层级关系,左对齐的数据,为同一层级
  3. 属性与值均大小写敏感
  4. 值的写法:字符、对象(属性与值)(键值对)、数组(List、Set)
    示例:
# 对象
person: 
	name: huathy
	age: 18
	boss: true
##行内写法
person: {name: huathy,age: 18}
# 数组
users: 
  - Huathy
  - LiSi
# 行内写法
users: [Huathy,LiSi]

properties语法

person.name=huathy
person.age=18
person.boss=false

yml文件取值

  1. 导入相关依赖
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>
  1. 创建实体
package com.hx.bean;

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

/**
 * 将配置文件中配置的每个属性的值映射到该组件中
 * @ConfigurationProperties 告诉springBoot将本类中的所有属性和配置文件中相关的配置进行绑定
 * (prefix = "person") 配置文件中那个下面的所有属性进行对应的映射
 * @Component 只有该组件在容器中才能使用容器提供的功能
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
	
	public String name;
	public Integer age;
	
	@Override
	public String toString() {
		return "Person [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;
	}	
}
  1. 创建测试类
/**
 * springBoot的单元测试
 * @RunWith 指定使用SpringBoot驱动器来测试,而不是junit来测试
 * 可以在测试期间很方便的类似编码一样的进行自动注入
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class Sb2YmlApplicationTests {

	@Autowired
	Person person;
	
	@Test
	public void test() {
		System.out.println(person);
	}
}

注意,@RunWith报错,则springBoot项目创建时自动导入的测试依赖需要将scope(或改为compile编译范围),以及下边的那一段注释掉,如下 示例。如果没有则导入依赖。

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<!-- <scope>test</scope>
	<exclusions>
		<exclusion>
			<groupId>org.junit.vintage</groupId>
			<artifactId>junit-vintage-engine</artifactId>
		</exclusion>
	</exclusions>
	 -->
</dependency>
  1. 输出示例,及项目结构
    在这里插入图片描述
  2. 注意在使用properties文件编写配置文件时,需要注意其编码格式是否支持中文。建议使用utf-8格式编码以支持中文。否则可能乱码。

@Value赋值

@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
	
	@Value("${person-name}")
	public String name;
	@Value("#{11*2}")
	public Integer age;
	@Value("true")
	public boolean isBoss;
	
	//省略getter、setter、toString
}

@PropertySource & @ImportResource

@PropertySource加载指定配置文件。

示例如下:

  1. person.properties
person.name=李四
person.age=18
person.boss=false
  1. Person.java
@PropertySource(value = {"classpath:person.properties"})
//告诉springBoot加载类路径下的person.properties文件,并注入到person对象中
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
	public String name;
	public Integer age;
	public boolean boss;
	//此处省略getter、setter、toString方法
}
  1. 测试方法
@RunWith(SpringRunner.class)
@SpringBootTest
public class Sb2YmlApplicationTests {

	@Autowired
	Person person;
	
	@Test
	public void test() {
		System.out.println(person);
	}
}

@ImportResource导入Spring的配置文件,使得Spring配置文件生效

示例如下:

  1. 创建一个HelloService
public class HelloService {
}
  1. 编写beans.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="hello" class="com.hx.service.HelloService"></bean>
  
</beans>
  1. 如果这时候测试是没有加载的,我们必须在springBoot主程序上添加@ImportResource注解
@ImportResource(locations = {"classpath:beans.xml"})
//导入Spring的配置文件,使得Spring配置文件生效

@SpringBootApplication
public class Sb2YmlApplication {
	public static void main(String[] args) {
		SpringApplication.run(Sb2YmlApplication.class, args);
	}
}
  1. 测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class Sb2YmlApplicationTests {
	@Autowired
	ApplicationContext ioc;
	
	@Test
	public void testHello() {
		System.out.println(ioc.containsBean("hello"));;
	}
}	

@Bean

这是SpringBoot推荐的使用全注解的方式给spring容器添加组件。
示例如下

  1. 创建MyAppConfig.java
/**
 * @Configuration 告诉springboot这是一个配置类,相当于之前的Spring配置文件
 * 在配置文件中使用<bean></bean>标签来添加组件
 */
@Configuration
public class MyAppConfig {
	
	@Bean
	//将方法的返回值添加到容器中,容器中这个租价默认的ID就是这个方法的方法名
	public HelloService helloService() {
		System.out.println("HelloService添加到容器中...");
		return new HelloService();
	}
}
  1. 测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class Sb2YmlApplicationTests {
	@Autowired
	ApplicationContext ioc;
	
	@Test
	public void testHello() {
		System.out.println("helloService-" + ioc.containsBean("helloService"));;
	}
}

好了以上就是说的是关于配置文件相关的。
一般的开发中我们可以采用@Service注解的方式来将service注入到Spring容器中。如下所示:

@Service
public class HelloService {
}

配置文件占位符

  1. 随机数
${random.int}
${random.int(10)}
${random.long}
${random.int[1024,6666]}
  1. 占位符获取之前的值,如果没有可以使用冒号来指定默认的值

示例如下:

person.name=李四
person.age=${random.int} #随机数
person.boss=false
person.descript = ${person.name}_${random.uuid}_${person.hello:hi}
#${random.uuid}  生成uuid
#${person.hello:hi}没有person.hello这个值,冒号之后的表示如果没有指定,则默认为hi

Profile多环境支持

多Profile文件,在主配置文件编写时,文件名可以是 application-profile.properties/yml
示例如下:
开发环境配置文件:appliication-dev.properties
生产环境配置文件:application-prod.properties
默认使用application.properties

激活指定的profile方法

在application.properties中写明:spring.profiles.active=dev

yml多文档块注释

yml文件指定

spring:
   profiles:
      active: prod
      
---
spring:
   profiles: dev
#端口配置
server:
  port: 8081

---
spring:
   profiles: prod
#端口配置
server:
  port: 8082

编译器参数方式指定

  1. 指定程序运行参数
    在这里插入图片描述
  2. 指定虚拟机参数
    在这里插入图片描述

命令行参数指定

  1. 指定程序运行参数
java -jar SB_Hello-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
  1. 指定虚拟机参数
java -jar SB_Hello-0.0.1-SNAPSHOT.jar -Dspring.profiles.active=dev

在这里插入图片描述

配置文件加载位置

springboot会按照优先级依次扫描以下位置的配置文件。如果存在相同内容以高优先级为准。文件都会加载,进行互补配置。

  1. file:./config/ 当前项目文件下的config文件夹中
  2. file:./ 当前项目的文件目录中
  3. classpath:/config/ 类路径下的config目录中
  4. classpath:/ 类路径中
  5. 在项目打包好后,可以用spring.config.location命令行参数,在启动项目时来指定配置文件新位置,指定的配置文件与以上位置的配置文件同时生效,并进行互补配置。示例: java -jar xxx.jar --spring.config.location=G:/xxx.properties

外部配置文件加载顺序

SpringBoot亦可从以下位置按照优先级加载配置文件,同时进行互补配置。
在这里插入图片描述

配置文件中可以配置的属性

参考官方文档:https://docs.spring.io/spring-boot/docs/2.3.x/reference/htmlsingle/#common-application-properties

SpringBoot自动配置原理

  1. spirngBoot在启动时加载主配置类,开启自动配置功能@EnableAutoConfiguration
  2. @EnableAutoConfiguration 注解的作用:利用 @Import(AutoConfigurationImportSelector.class) 给容器中导入一些组件
    AutoConfigurationImportSelector.java中存在以下方法
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
	if (!isEnabled(annotationMetadata)) {
		return NO_IMPORTS;
	}
	AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
	return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

随后通过SpringFactoriesLoader.loadFactoryNames()方法扫描jar包类路径下 META-INF/spring.factories,将扫描到的内容包装成properties对象。从properties中获取到EnableAutoConfiguration.class类对应的值,然后把他们添加到容器中。将类路径下 META-INF/spring.factories 中配置的所有 EnableAutoConfiguration 的值加入到容器中。每一个xxxAutoConfiguration类都是容器的一个组件,都加入到容器中,用他们来做配置。

每一个配置类进行自动配置功能。




待完善……
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot 是基于 Spring 框架的一个快速开发框架,它能够简化 Spring 应用的初始化过程、开发和部署,提高开发效率。下面是 Spring Boot学习笔记: ## 1. Spring Boot 简介 Spring BootSpring 家族的一个全新的框架,它的设计目的是为了快速开发基于 Spring 的应用程序。 Spring Boot 采用了约定大于配置的原则,通过自动配置、快速开发、可插拔的特性,让开发者可以更加专注于业务逻辑。 ## 2. Spring Boot 的优点 - 简化配置Spring Boot 通过自动配置的方式,避免了繁琐的配置。 - 快速开发:Spring Boot 集成了很多常用的框架和工具,使得开发过程更加快速。 - 易于部署:Spring Boot 可以将应用程序打包成 jar 包或 war 包,方便部署和运行。 - 微服务支持:Spring Boot 对于微服务的支持非常好,可以使用 Spring Cloud 进行服务治理。 ## 3. Spring Boot 的核心原理 Spring Boot 的核心原理是通过自动配置和约定大于配置来简化开发过程。 自动配置是指 Spring Boot 会根据项目的依赖和配置自动为项目进行配置。开发者只需要添加相应的依赖,就可以使用相应的功能,无需进行繁琐的配置。 约定大于配置是指 Spring Boot 对于一些常见的配置,采用一些约定的方式进行配置。开发者只需要按照约定的方式进行开发,就可以使用相应的功能。 ## 4. Spring Boot 的常用注解 - @SpringBootApplicationSpring Boot 应用程序的入口,同时也是 Spring配置文件。 - @RestController:用于定义 RESTful 接口的控制器。 - @RequestMapping:用于定义请求的 URL 和请求方法。 - @Autowired:用于自动注入依赖。 - @Value:用于获取配置文件中的属性值。 ## 5. Spring Boot 的常用组件 - Spring MVC:用于定义 RESTful 接口和处理请求。 - Spring Data:用于简化数据库操作。 - Spring Security:用于实现安全认证和授权。 - Spring Boot Actuator:用于监控和管理应用程序。 ## 6. Spring Boot 的开发步骤 - 创建 Spring Boot 项目。 - 添加项目依赖。 - 编写业务代码。 - 运行项目。 ## 7. Spring Boot 的部署方式 - 打包成 jar 包,使用 java -jar 命令运行。 - 打包成 war 包,部署到 Tomcat 或其他 Servlet 容器中。 ## 8. Spring Boot 的监控和管理 Spring Boot Actuator 提供了一系列的监控和管理功能,包括健康检查、性能监控、日志记录等。可以通过 HTTP 接口或 JMX 进行访问和管理。 ## 9. Spring Boot 的测试 Spring Boot 提供了很好的测试支持,可以使用 JUnit 进行单元测试和集成测试。同时也可以使用 Spring Boot Test 提供的测试框架进行测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huathy-雨落江南,浮生若梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值