# Typed Configuration Properties — Spring Boot

Source: https://www.skillbyai.com/en/spring-boot/d-props

> Bind settings to records.

## @ConfigurationProperties

Settings live in `application.properties` or `application.yaml` and can be overridden by environment variables, command-line arguments and profile-specific files. `@ConfigurationProperties(prefix = "shop")` binds related settings to a typed class or record (`shop.max-page-size` maps to `maxPageSize`), which is safer than scattering `@Value` strings. Register it with `@EnableConfigurationProperties` or scanning, and validate it with Bean Validation annotations if needed.

## application.properties and the bound record

This file is from a demo "shop" service generated by start.spring.io for Spring Boot 4.1.1 and Java 21 (Temurin 21.0.12), built with Maven 3.9.16; the project compiled and its tests passed. Both custom keys bind to ShopProperties; the datasource uses an in-memory H2 database and open-in-view is disabled.

```properties
spring.application.name=shop
spring.datasource.url=jdbc:h2:mem:shop
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.open-in-view=false
management.endpoints.web.exposure.include=health,info
management.endpoint.health.show-details=always
shop.max-page-size=50
shop.currency=INR

# ShopProperties.java
package com.example.shop;

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

@ConfigurationProperties(prefix = "shop")
public record ShopProperties(int maxPageSize, String currency) { }
```

## Override with environment variables

SHOP_CURRENCY=USD overrides shop.currency at runtime without rebuilding, thanks to relaxed binding.

**Quiz:** What does @ConfigurationProperties(prefix = "shop") do?

- [ ] Defines a REST endpoint
- [ ] Creates a database table
- [ ] Disables configuration
- [x] Binds shop.* settings to a typed class or record

*Answer:* Binds shop.* settings to a typed class or record. Type-safe configuration.
