《Spring in Action》第5章-Configuration Properties

Spring Boot 配置与Profile

Configuration Properties

调整自动配置

Environment abstraction

对于任何可配置属性来说,Spring的Enviroment abstraction就是一个一站式的仓库。它抽象出各种属性源以供bean使用。Spring从以下几个属性源中抽取属性:

  1. JVM system propterties
  2. 操作系统环境变量
  3. 命令行参数
  4. 应用的属性配置文件
    Spring environment将这些属性整合起来放入一个单独的属性源中,这个源中的属性可以被注入到bean中。

配置DataSource

spring:
	datasource:
		url: jdbc:mysql://localhost/tacocloud
		username: tacodb
		password: tacopwd
		driver-class-name: com.mysql.jdbc.Driver #一般情况下Spring会通过url自动识别driverclass
		schema: # 默认值为schema.sql
		- order-schema.sql
		- ingredient-schema.sql
		data: ingredients.sql #默认值为data.sql
		jndi-name: java:/comp/env/jdbc/tacoCloudDS #如果配置了jndi,其他的数据源配置都会被忽略

配置被嵌入的服务

我们使用server.port来配置应用的监听端口。若我们将server.port的值设为0,那么应用不会监听端口0,而是随机的监听一个可用端口。当我们对组件进行并发测试时,使用随机端口就能避免同硬编码指定端口的组件测试发生冲突。同时一些微服务也不需要指定端口,因为我们会在服务注册机上查找这些服务。

开启HTTPS

1.使用JDK的keytool命令行生成keystore:

 $ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA

如下图所示,创建keystore的过程中会被问几个问题,同时会要求创建秘钥库口令及秘钥口令,这两个密码要记住,在应用中需要设置。mykeys.jks会在用户的家目录下生成。

2. 配置ssl

server:
	port:8443
	ssl:
		key-store: file:C:\Users\administrator\mykeys.jks #从文件系统中加载keystore文件,如果文件在应用的JAR文件中,则使用classpath:
		key-store-password: 123456
		key-password: 123456

配置日志

Spring Boot 默认使用Logback来记录日志。我们可以在classpath的根目录下(src/main/resources)创建一个名为logback.xml的文件来配置logback。

对日志最常见的配置就是改变日志级别或者将日志输出到指定文件中,我们不用创建logback.xml也能配置:

logging:
	file:
		#path和name只有一个会生效
		path: /var/logs/ #会在/var/logs/目录下生成spring.log
		name: /var/logs/TacoCloud.log
	level:
		root: WARN
		org: :
			springframework:
				security: DEBUG

特殊的属性值

在配置属性值的时候,我们不仅可以直接指定字符串或者数字,我们还可以引用其它属性的值:

spring:
	application:
		name: TacoCloud
greeting:
	welcome: ${spring.application.name}

使用${}表达式就可以引用其它属性的值。

创建自己的配置属性

在任何的bean上使用@ConfigurationProperties注解,使得该bean的属性可以从Spring environment中注入。

我们在application.yml中定义:

taco:
	order:
		pageSize: 20

OrderController这个bean上做一下修改:

  1. 增加@ConfigurationProperties(prefix="taco.order")注解
  2. 为需要注解的属性添加setter方法。(必须)
@Controller
@RequestMapping("/orders")
@SessionAttributes("order")
@ConfigurationProperties(prefix="taco.order") //定义了属性前缀
public class OrderController{

	private int pageSize; //配置文件中taco.order.pageSize属性值将会被注入

	public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
	@GetMapping
	public String ordersForUser(@AuthenticationPrincipal User user, Model model){

	}
}

创建Configuration property holder

@Component
@ConfigurationProperties(prefix = "taco.order")
@Data
public class OrderProps {
    private int pageSize = 20;
}

我们将属性使用单独的类来管理,并将这个类注册为bean,那么OrderController可以通过注入OrderProps来获取pageSize。这样做使得Controller比较简洁,也提高了pageSize属性的重用性,同时我们可以在OrderProps类中做许多专注于属性的工作,如属性值的约束校验等。

Profiles

使用application-{profile name}命名格式创建.properties.yml文件,从而定义不同profile的属性。也可以在YML配置文件中,使用---spring:profiles: {profile name}来隔离两个不同profile的配置。

logging:
	level:
		tacos: DEBUG

---
spring:
	profiles: prod
	datasource:
		url: jdbc:mysql://localhost/tacoCloud
		username: tacouser
		password: tacopassword

上面的配置被分成了两个部分,第二个部分是名为"prod"的profile,只有当"prod"被激活时,spring:profiles:prod后面的配置才会生效。而第一部分没有指明profile,那么这部分就是公共部分,无论哪个profile被激活,这部分配置是有效的。

激活profiles

  1. 命令行
$ java -jar taco-cloud.jar --spring.profiles.active=dev
  1. 系统变量
$ export SPRING_PROFILES_ACTIVE=dev

任何部署在该机器上的应用的dev profile都将被激活
3. java系统参数

$ java -jar -Dspring.profiles.active=dev taco-cloud.jar
  1. 配置文件
spring:
    profiles:
   	 active: dev

以上4中配置方式优先级同其序号。同时存在多个激活配置,那么优先级最好的被采纳。

推荐使用命令行进行配置,灵活度最高。不推荐使用配置文件。

激活多个profiles

可以使用都好将各个profile隔开以达到激活多个profile,如:

$ java -jar taco-cloud.jar --spring.profiles.active=dev,audit,ha

或者:

spring:
	profiles:
		active:
			- dev
			- audit
			- ha

有选择的创建bean

@Profile注解将帮助我们有选择的创建bean

//只在dev被激活时创建
@Profile("dev")
@Controller
public class devController{}

//只在dev或者audit被激活时创建
@Profile({"dev","audit"})
@Controller
public class devController{}

//只要不是audit环境,就被创建
@Profile("!audit")
@Controller
public class devController{}

//只要不是audit或者qa环境,就被创建
@Profile({"!audit","!qa"})
@Controller
public class devController{}

我们还可以在配置类上进行这样的注解

//只有在dev环境下,该配置类中的配置才会生效
@Profile("dev")
@Configuration
public devConfiguration{

	@Bean
	....
}
C:\Users\Lenovo\.jdks\corretto-1.8.0_462\bin\java.exe -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:D:\IntelliJ IDEA 2025.2\lib\idea_rt.jar=2427" -Dfile.encoding=UTF-8 -classpath "C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\charsets.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\access-bridge-64.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\cldrdata.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\dnsns.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\jaccess.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\jfxrt.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\localedata.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\nashorn.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\sunec.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\sunjce_provider.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\sunmscapi.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\sunpkcs11.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\ext\zipfs.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\jce.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\jfr.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\jfxswt.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\jsse.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\management-agent.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\resources.jar;C:\Users\Lenovo\.jdks\corretto-1.8.0_462\jre\lib\rt.jar;E:\前后端代码\shigong-new_20250810 (2)\shigong-new - 副本\ruoyi-modules\activiti\target\classes;C:\JAVA\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-discovery\2021.0.5.0\spring-cloud-starter-alibaba-nacos-discovery-2021.0.5.0.jar;C:\JAVA\repository\com\alibaba\cloud\spring-cloud-alibaba-commons\2021.0.5.0\spring-cloud-alibaba-commons-2021.0.5.0.jar;C:\JAVA\repository\com\alibaba\nacos\nacos-client\2.2.0\nacos-client-2.2.0.jar;C:\JAVA\repository\com\alibaba\nacos\nacos-auth-plugin\2.2.0\nacos-auth-plugin-2.2.0.jar;C:\JAVA\repository\com\alibaba\nacos\nacos-encryption-plugin\2.2.0\nacos-encryption-plugin-2.2.0.jar;C:\JAVA\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;C:\JAVA\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;C:\JAVA\repository\org\apache\httpcomponents\httpcore-nio\4.4.16\httpcore-nio-4.4.16.jar;C:\JAVA\repository\io\prometheus\simpleclient\0.15.0\simpleclient-0.15.0.jar;C:\JAVA\repository\io\prometheus\simpleclient_tracer_otel\0.15.0\simpleclient_tracer_otel-0.15.0.jar;C:\JAVA\repository\io\prometheus\simpleclient_tracer_common\0.15.0\simpleclient_tracer_common-0.15.0.jar;C:\JAVA\repository\io\prometheus\simpleclient_tracer_otel_agent\0.15.0\simpleclient_tracer_otel_agent-0.15.0.jar;C:\JAVA\repository\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;C:\JAVA\repository\com\alibaba\spring\spring-context-support\1.0.11\spring-context-support-1.0.11.jar;C:\JAVA\repository\org\springframework\cloud\spring-cloud-commons\3.1.7\spring-cloud-commons-3.1.7.jar;C:\JAVA\repository\org\springframework\security\spring-security-crypto\5.7.9\spring-security-crypto-5.7.9.jar;C:\JAVA\repository\org\springframework\cloud\spring-cloud-context\3.1.7\spring-cloud-context-3.1.7.jar;C:\JAVA\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-config\2021.0.5.0\spring-cloud-starter-alibaba-nacos-config-2021.0.5.0.jar;C:\JAVA\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;C:\JAVA\repository\com\mysql\mysql-connector-j\8.0.33\mysql-connector-j-8.0.33.jar;E:\前后端代码\shigong-new_20250810 (2)\shigong-new - 副本\ruoyi-common\ruoyi-common-core\target\classes;C:\JAVA\repository\org\springframework\cloud\spring-cloud-starter-openfeign\3.1.8\spring-cloud-starter-openfeign-3.1.8.jar;C:\JAVA\repository\org\springframework\cloud\spring-cloud-openfeign-core\3.1.8\spring-cloud-openfeign-core-3.1.8.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-starter-aop\2.7.13\spring-boot-starter-aop-2.7.13.jar;C:\JAVA\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;C:\JAVA\repository\io\github\openfeign\form\feign-form-spring\3.8.0\feign-form-spring-3.8.0.jar;C:\JAVA\repository\io\github\openfeign\form\feign-form\3.8.0\feign-form-3.8.0.jar;C:\JAVA\repository\commons-fileupload\commons-fileupload\1.5\commons-fileupload-1.5.jar;C:\JAVA\repository\io\github\openfeign\feign-core\11.10\feign-core-11.10.jar;C:\JAVA\repository\io\github\openfeign\feign-slf4j\11.10\feign-slf4j-11.10.jar;C:\JAVA\repository\org\springframework\cloud\spring-cloud-starter-loadbalancer\3.1.7\spring-cloud-starter-loadbalancer-3.1.7.jar;C:\JAVA\repository\org\springframework\cloud\spring-cloud-loadbalancer\3.1.7\spring-cloud-loadbalancer-3.1.7.jar;C:\JAVA\repository\io\projectreactor\reactor-core\3.4.30\reactor-core-3.4.30.jar;C:\JAVA\repository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;C:\JAVA\repository\io\projectreactor\addons\reactor-extra\3.4.10\reactor-extra-3.4.10.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-starter-cache\2.7.13\spring-boot-starter-cache-2.7.13.jar;C:\JAVA\repository\com\stoyanr\evictor\1.0.0\evictor-1.0.0.jar;C:\JAVA\repository\org\springframework\spring-context-support\5.3.28\spring-context-support-5.3.28.jar;C:\JAVA\repository\org\springframework\spring-beans\5.3.28\spring-beans-5.3.28.jar;C:\JAVA\repository\org\springframework\spring-context\5.3.28\spring-context-5.3.28.jar;C:\JAVA\repository\org\springframework\spring-aop\5.3.28\spring-aop-5.3.28.jar;C:\JAVA\repository\org\springframework\spring-expression\5.3.28\spring-expression-5.3.28.jar;C:\JAVA\repository\org\springframework\spring-core\5.3.28\spring-core-5.3.28.jar;C:\JAVA\repository\org\springframework\spring-jcl\5.3.28\spring-jcl-5.3.28.jar;C:\JAVA\repository\org\springframework\spring-web\5.3.28\spring-web-5.3.28.jar;C:\JAVA\repository\com\alibaba\transmittable-thread-local\2.14.3\transmittable-thread-local-2.14.3.jar;C:\JAVA\repository\com\github\pagehelper\pagehelper-spring-boot-starter\1.4.7\pagehelper-spring-boot-starter-1.4.7.jar;C:\JAVA\repository\com\github\pagehelper\pagehelper-spring-boot-autoconfigure\1.4.7\pagehelper-spring-boot-autoconfigure-1.4.7.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-starter-validation\2.7.13\spring-boot-starter-validation-2.7.13.jar;C:\JAVA\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.76\tomcat-embed-el-9.0.76.jar;C:\JAVA\repository\org\hibernate\validator\hibernate-validator\6.2.5.Final\hibernate-validator-6.2.5.Final.jar;C:\JAVA\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;C:\JAVA\repository\org\jboss\logging\jboss-logging\3.4.3.Final\jboss-logging-3.4.3.Final.jar;C:\JAVA\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\JAVA\repository\com\fasterxml\jackson\core\jackson-databind\2.13.5\jackson-databind-2.13.5.jar;C:\JAVA\repository\com\alibaba\fastjson2\fastjson2\2.0.39\fastjson2-2.0.39.jar;C:\JAVA\repository\io\jsonwebtoken\jjwt\0.9.1\jjwt-0.9.1.jar;C:\JAVA\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\JAVA\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\JAVA\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;C:\JAVA\repository\commons-io\commons-io\2.13.0\commons-io-2.13.0.jar;C:\JAVA\repository\org\apache\poi\poi-ooxml\4.1.2\poi-ooxml-4.1.2.jar;C:\JAVA\repository\org\apache\poi\poi-ooxml-schemas\4.1.2\poi-ooxml-schemas-4.1.2.jar;C:\JAVA\repository\org\apache\xmlbeans\xmlbeans\3.1.0\xmlbeans-3.1.0.jar;C:\JAVA\repository\com\github\virtuald\curvesapi\1.06\curvesapi-1.06.jar;C:\JAVA\repository\org\apache\poi\poi\4.1.2\poi-4.1.2.jar;C:\JAVA\repository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;C:\JAVA\repository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;C:\JAVA\repository\com\zaxxer\SparseBitSet\1.2\SparseBitSet-1.2.jar;C:\JAVA\repository\javax\servlet\javax.servlet-api\4.0.1\javax.servlet-api-4.0.1.jar;C:\JAVA\repository\com\baomidou\mybatis-plus-boot-starter\3.3.0\mybatis-plus-boot-starter-3.3.0.jar;C:\JAVA\repository\com\baomidou\mybatis-plus\3.3.0\mybatis-plus-3.3.0.jar;C:\JAVA\repository\com\baomidou\mybatis-plus-extension\3.3.0\mybatis-plus-extension-3.3.0.jar;C:\JAVA\repository\com\baomidou\mybatis-plus-core\3.3.0\mybatis-plus-core-3.3.0.jar;C:\JAVA\repository\com\baomidou\mybatis-plus-annotation\3.3.0\mybatis-plus-annotation-3.3.0.jar;C:\JAVA\repository\org\apache\httpcomponents\httpclient\4.5.14\httpclient-4.5.14.jar;C:\JAVA\repository\org\apache\httpcomponents\httpmime\4.5.14\httpmime-4.5.14.jar;C:\JAVA\repository\cn\hutool\hutool-all\5.3.4\hutool-all-5.3.4.jar;C:\JAVA\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;C:\JAVA\repository\com\drewnoakes\metadata-extractor\2.15.0\metadata-extractor-2.15.0.jar;C:\JAVA\repository\com\adobe\xmp\xmpcore\6.0.6\xmpcore-6.0.6.jar;C:\JAVA\repository\com\belerweb\pinyin4j\2.5.0\pinyin4j-2.5.0.jar;C:\JAVA\repository\commons-beanutils\commons-beanutils\1.9.4\commons-beanutils-1.9.4.jar;C:\JAVA\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\JAVA\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\JAVA\repository\org\locationtech\proj4j\proj4j\1.3.0\proj4j-1.3.0.jar;C:\JAVA\repository\org\locationtech\proj4j\proj4j-epsg\1.3.0\proj4j-epsg-1.3.0.jar;C:\JAVA\repository\org\jsoup\jsoup\1.12.1\jsoup-1.12.1.jar;C:\JAVA\repository\org\freemarker\freemarker\2.3.32\freemarker-2.3.32.jar;E:\前后端代码\shigong-new_20250810 (2)\shigong-new - 副本\ruoyi-common\ruoyi-common-log\target\classes;E:\前后端代码\shigong-new_20250810 (2)\shigong-new - 副本\ruoyi-common\ruoyi-common-security\target\classes;C:\JAVA\repository\org\springframework\spring-webmvc\5.3.28\spring-webmvc-5.3.28.jar;E:\前后端代码\shigong-new_20250810 (2)\shigong-new - 副本\ruoyi-api\ruoyi-api-system\target\classes;E:\前后端代码\shigong-new_20250810 (2)\shigong-new - 副本\ruoyi-common\ruoyi-common-redis\target\classes;C:\JAVA\repository\org\springframework\boot\spring-boot-starter-data-redis\2.7.13\spring-boot-starter-data-redis-2.7.13.jar;C:\JAVA\repository\org\springframework\data\spring-data-redis\2.7.13\spring-data-redis-2.7.13.jar;C:\JAVA\repository\org\springframework\data\spring-data-keyvalue\2.7.13\spring-data-keyvalue-2.7.13.jar;C:\JAVA\repository\org\springframework\data\spring-data-commons\2.7.13\spring-data-commons-2.7.13.jar;C:\JAVA\repository\org\springframework\spring-oxm\5.3.28\spring-oxm-5.3.28.jar;C:\JAVA\repository\redis\clients\jedis\3.8.0\jedis-3.8.0.jar;C:\JAVA\repository\org\apache\commons\commons-pool2\2.11.1\commons-pool2-2.11.1.jar;C:\JAVA\repository\org\gavaghan\geodesy\1.1.3\geodesy-1.1.3.jar;C:\JAVA\repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.1.3\mybatis-spring-boot-starter-2.1.3.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-starter\2.7.13\spring-boot-starter-2.7.13.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-starter-logging\2.7.13\spring-boot-starter-logging-2.7.13.jar;C:\JAVA\repository\ch\qos\logback\logback-classic\1.2.12\logback-classic-1.2.12.jar;C:\JAVA\repository\ch\qos\logback\logback-core\1.2.12\logback-core-1.2.12.jar;C:\JAVA\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;C:\JAVA\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;C:\JAVA\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-starter-jdbc\2.7.13\spring-boot-starter-jdbc-2.7.13.jar;C:\JAVA\repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;C:\JAVA\repository\org\springframework\spring-jdbc\5.3.28\spring-jdbc-5.3.28.jar;C:\JAVA\repository\org\springframework\spring-tx\5.3.28\spring-tx-5.3.28.jar;C:\JAVA\repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.1.3\mybatis-spring-boot-autoconfigure-2.1.3.jar;C:\JAVA\repository\org\mybatis\mybatis\3.5.5\mybatis-3.5.5.jar;C:\JAVA\repository\org\mybatis\mybatis-spring\2.0.5\mybatis-spring-2.0.5.jar;C:\JAVA\repository\org\apache\logging\log4j\log4j-api\2.17.1\log4j-api-2.17.1.jar;C:\JAVA\repository\com\github\pagehelper\pagehelper\5.1.8\pagehelper-5.1.8.jar;C:\JAVA\repository\com\github\jsqlparser\jsqlparser\1.2\jsqlparser-1.2.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-starter-websocket\2.7.13\spring-boot-starter-websocket-2.7.13.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-starter-web\2.7.13\spring-boot-starter-web-2.7.13.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-starter-json\2.7.13\spring-boot-starter-json-2.7.13.jar;C:\JAVA\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.5\jackson-datatype-jdk8-2.13.5.jar;C:\JAVA\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.5\jackson-datatype-jsr310-2.13.5.jar;C:\JAVA\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.5\jackson-module-parameter-names-2.13.5.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-starter-tomcat\2.7.13\spring-boot-starter-tomcat-2.7.13.jar;C:\JAVA\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.76\tomcat-embed-core-9.0.76.jar;C:\JAVA\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.76\tomcat-embed-websocket-9.0.76.jar;C:\JAVA\repository\org\springframework\spring-messaging\5.3.28\spring-messaging-5.3.28.jar;C:\JAVA\repository\org\springframework\spring-websocket\5.3.28\spring-websocket-5.3.28.jar;C:\JAVA\repository\org\projectlombok\lombok\1.18.28\lombok-1.18.28.jar;C:\JAVA\repository\io\minio\minio\8.4.5\minio-8.4.5.jar;C:\JAVA\repository\com\carrotsearch\thirdparty\simple-xml-safe\2.7.1\simple-xml-safe-2.7.1.jar;C:\JAVA\repository\com\google\guava\guava\30.1.1-jre\guava-30.1.1-jre.jar;C:\JAVA\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\JAVA\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\JAVA\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\JAVA\repository\org\checkerframework\checker-qual\3.8.0\checker-qual-3.8.0.jar;C:\JAVA\repository\com\google\errorprone\error_prone_annotations\2.5.1\error_prone_annotations-2.5.1.jar;C:\JAVA\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;C:\JAVA\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.5\jackson-annotations-2.13.5.jar;C:\JAVA\repository\com\fasterxml\jackson\core\jackson-core\2.13.5\jackson-core-2.13.5.jar;C:\JAVA\repository\org\bouncycastle\bcprov-jdk15on\1.69\bcprov-jdk15on-1.69.jar;C:\JAVA\repository\org\apache\commons\commons-compress\1.21\commons-compress-1.21.jar;C:\JAVA\repository\org\xerial\snappy\snappy-java\1.1.8.4\snappy-java-1.1.8.4.jar;C:\JAVA\repository\com\squareup\okhttp3\okhttp\4.9.0\okhttp-4.9.0.jar;C:\JAVA\repository\com\squareup\okio\okio\2.8.0\okio-2.8.0.jar;C:\JAVA\repository\org\jetbrains\kotlin\kotlin-stdlib-common\1.6.21\kotlin-stdlib-common-1.6.21.jar;C:\JAVA\repository\org\jetbrains\kotlin\kotlin-stdlib\1.6.21\kotlin-stdlib-1.6.21.jar;C:\JAVA\repository\org\jetbrains\annotations\13.0\annotations-13.0.jar;C:\JAVA\repository\net\coobird\thumbnailator\0.4.8\thumbnailator-0.4.8.jar;C:\JAVA\repository\org\springframework\cloud\spring-cloud-starter-bootstrap\3.1.7\spring-cloud-starter-bootstrap-3.1.7.jar;C:\JAVA\repository\org\springframework\cloud\spring-cloud-starter\3.1.7\spring-cloud-starter-3.1.7.jar;C:\JAVA\repository\org\springframework\security\spring-security-rsa\1.0.11.RELEASE\spring-security-rsa-1.0.11.RELEASE.jar;C:\JAVA\repository\org\bouncycastle\bcpkix-jdk15on\1.69\bcpkix-jdk15on-1.69.jar;C:\JAVA\repository\org\bouncycastle\bcutil-jdk15on\1.69\bcutil-jdk15on-1.69.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-configuration-processor\2.7.13\spring-boot-configuration-processor-2.7.13.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-devtools\2.7.13\spring-boot-devtools-2.7.13.jar;C:\JAVA\repository\org\springframework\boot\spring-boot\2.7.13\spring-boot-2.7.13.jar;C:\JAVA\repository\org\springframework\boot\spring-boot-autoconfigure\2.7.13\spring-boot-autoconfigure-2.7.13.jar" com.yupont.app.ActivitiApplication 10:13:52.793 [Thread-1] DEBUG org.springframework.boot.devtools.restart.classloader.RestartClassLoader - Created RestartClassLoader org.springframework.boot.devtools.restart.classloader.RestartClassLoader@28b66390 2025-08-21 10:13:53.059 INFO 3976 --- [ restartedMain] c.a.n.client.env.SearchableProperties : properties search order:PROPERTIES->JVM->ENV->DEFAULT_SETTING 2025-08-21 10:13:53.175 INFO 3976 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable 2025-08-21 10:13:53.382 INFO 3976 --- [ restartedMain] c.a.n.p.a.s.c.ClientAuthPluginManager : [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.impl.NacosClientAuthServiceImpl success. 2025-08-21 10:13:53.382 INFO 3976 --- [ restartedMain] c.a.n.p.a.s.c.ClientAuthPluginManager : [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.ram.RamClientAuthServiceImpl success. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.13) 2025-08-21 10:14:00.385 WARN 3976 --- [ restartedMain] c.a.c.n.c.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[null.properties] & group[DEFAULT_GROUP] 2025-08-21 10:14:00.386 INFO 3976 --- [ restartedMain] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-null.properties,DEFAULT_GROUP'}] 2025-08-21 10:14:00.399 INFO 3976 --- [ restartedMain] com.yupont.app.ActivitiApplication : No active profile set, falling back to 1 default profile: "default" 2025-08-21 10:14:01.046 INFO 3976 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode 2025-08-21 10:14:01.048 INFO 3976 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. 2025-08-21 10:14:01.059 INFO 3976 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 Redis repository interfaces. 2025-08-21 10:14:01.160 WARN 3976 --- [ restartedMain] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.yupont.app.*.dao]' package. Please check your configuration. 2025-08-21 10:14:01.199 INFO 3976 --- [ restartedMain] o.s.cloud.context.scope.GenericScope : BeanFactory id=84bfe0a8-a36d-3907-9c5a-a783377777d2 2025-08-21 10:14:01.711 INFO 3976 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2025-08-21 10:14:01.719 INFO 3976 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-08-21 10:14:01.719 INFO 3976 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.76] 2025-08-21 10:14:01.867 INFO 3976 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-08-21 10:14:01.867 INFO 3976 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1444 ms 2025-08-21 10:14:02.381 WARN 3976 --- [ restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class 2025-08-21 10:14:02.382 INFO 3976 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2025-08-21 10:14:02.392 INFO 3976 --- [ restartedMain] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2025-08-21 10:14:02.410 ERROR 3976 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active). 2025-08-21 10:14:02.412 WARN 3976 --- [ Thread-12] c.a.nacos.common.notify.NotifyCenter : [NotifyCenter] Start destroying Publisher 2025-08-21 10:14:02.412 WARN 3976 --- [ Thread-5] c.a.n.common.http.HttpClientBeanHolder : [HttpClientBeanHolder] Start destroying common HttpClient 2025-08-21 10:14:02.412 WARN 3976 --- [ Thread-12] c.a.nacos.common.notify.NotifyCenter : [NotifyCenter] Destruction of the end 进程已结束,退出代码为 0
最新发布
08-22
<think>我们正在处理一个Spring Boot启动失败的问题,错误信息是:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class. 根据引用[4],这个问题的根本原因是:我们在pom.xml中配置了spring-boot-starter-jdbc(或者可能是spring-boot-starter-data-jpa)依赖,但是Spring Boot的自动配置机制在配置文件中找不到数据库连接配置(url等),而且也没有嵌入式数据库(如H2, HSQL, Derby)在类路径上。 解决思路: 1. 检查是否真的需要数据库:如果不需要数据库,可以移除相关依赖。 2. 如果需要数据库,检查配置文件中是否配置了数据库连接信息(如application.properties或application.yml)。 3. 检查是否激活了正确的profile(因为数据库配置可能在某个profile中)。 4. 检查类路径中是否有嵌入式数据库(如果打算使用嵌入式数据库)。 具体步骤: 步骤1:检查依赖 查看pom.xml(或build.gradle)中是否有数据库相关的starter,例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 或者 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> ``` 如果不需要数据库,移除这些依赖并重新启动。 步骤2:添加数据库配置 如果需要数据库,在application.properties中添加如下配置(以MySQL为例): ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 或者在application.yml中: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/mydatabase username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` 步骤3:检查数据库驱动 确保在pom.xml中引入了对应的数据库驱动,例如MySQL: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ``` 步骤4:检查Profile配置 如果数据库配置在特定的profile中(如application-dev.properties),则需要激活该profile。可以通过以下方式激活: 在application.properties中设置: ```properties spring.profiles.active=dev ``` 或者通过命令行参数: ```bash java -jar your-application.jar --spring.profiles.active=dev ``` 步骤5:使用嵌入式数据库 如果希望使用嵌入式数据库(如H2),则添加H2依赖: ```xml <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> ``` 并且不需要配置url,Spring Boot会自动配置一个内存数据库。 步骤6:排除自动配置(可选) 如果确实不需要配置数据源,但又不想移除依赖,可以通过排除自动配置来解决: 在主启动类上添加: ```java @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) ``` 这样Spring Boot就不会自动配置数据源。 总结:根据引用[4],这个错误是由于配置了数据库相关的依赖,但没有提供数据库连接信息,也没有嵌入式数据库依赖。因此,要么移除依赖,要么添加配置,要么添加嵌入式数据库依赖。 相关问题: 1. 如何排除Spring Boot的自动配置类? 2. Spring Boot如何配置多数据源? 3. 如何在不同环境下使用不同的数据库配置(如开发、测试、生产)? 4. Spring Boot支持哪些嵌入式数据库?如何配置? 5. 为什么添加了数据库驱动仍然报错找不到合适的驱动类?</think>### Spring Boot 启动失败:`Failed to configure a DataSource` 问题解析与解决方案 #### 错误本质分析 根据引用[1][2][3][4],该错误的根本原因是 **Spring Boot 无法正确配置数据源**,具体表现为: ```log Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class ``` 核心问题可归纳为: 1. **数据源 URL 未配置**:应用未提供数据库连接地址[^1][^2] 2. **驱动类缺失**:无法识别数据库驱动类型(如 MySQL/Oracle 等)[^3] 3. **依赖冲突**:`spring-boot-starter-jdbc` 或 `spring-boot-starter-data-jpa` 存在但无有效配置[^4] --- ### 解决步骤(按优先级排序) #### 1. 检查数据源配置(关键步骤) 在 `application.properties` 或 `application.yml` 中添加完整配置: ```properties # MySQL 示例 spring.datasource.url=jdbc:mysql://localhost:3306/your_db spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # H2 嵌入式数据库示例 spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driver-class-name=org.h2.Driver ``` #### 2. 验证依赖配置 在 `pom.xml` 中检查并添加必要依赖: ```xml <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!-- 或 H2 嵌入式数据库 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> ``` #### 3. 激活 Profile 配置 若使用多环境配置,需显式激活 Profile: ```bash # 启动时激活 dev 配置 mvn spring-boot:run -Dspring-boot.run.profiles=dev ``` #### 4. 排除自动配置(特殊场景) 如果项目不需要数据库,在启动类添加排除项: ```java @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 5. 检查依赖冲突 执行命令排查冲突: ```bash mvn dependency:tree ``` 移除冗余的 JDBC/JPA 依赖: ```xml <!-- 移除冲突依赖示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions> </dependency> ``` --- ### 根本原因总结 | 问题类型 | 触发条件 | 解决方案 | |-------------------|--------------------------------------------------------------------------|------------------------------| | URL未配置 | 配置文件中缺失 `spring.datasource.url` | 补全数据库连接地址 | | 驱动类缺失 | 未添加数据库驱动依赖 或 依赖版本冲突 | 添加正确驱动依赖 | | Profile未激活 | 多环境配置中数据库设置写在 `application-dev.yml` 但未激活 | 启动时添加 `-Dspring.profiles.active=dev` | | 冗余依赖 | 存在 `spring-boot-starter-jdbc` 但实际不需要数据库 | 排除自动配置或移除依赖 | > **关键提示**:根据引用[4],该错误本质是 Spring Boot 的自动装配机制在类路径检测到 JDBC/JPA 依赖时,强制要求配置有效数据源[^4]。合理管理依赖是预防此类问题的核心。 --- ### 相关问题 1. 如何在 Spring Boot 中配置多数据源? 2. 使用 H2 嵌入式数据库时需要注意哪些性能问题? 3. 如何通过 Spring Actuator 监控数据库连接池状态? 4. 数据库连接池(如 HikariCP)的最佳配置参数有哪些? 5. 如何在单元测试中隔离数据库依赖?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值