DEV Community

Sadiul Hakim
Sadiul Hakim

Posted on

Spring Boot Properties: Complete Tutorial

1. What are Spring Boot Properties?

Spring Boot properties are configuration settings that control the behavior of your Spring Boot application. They allow you to externalize configuration and work with the same application code in different environments.

Types of Properties:

  • Application Properties: Basic application configuration
  • Profile-specific Properties: Environment-specific configurations
  • Third-party Properties: Configuration for integrated libraries and frameworks

2. Why Use Properties and When?

Benefits:

  • Externalized Configuration: Separate configuration from code
  • Environment-specific Settings: Different configurations for dev, test, prod
  • No Code Changes: Modify behavior without recompiling
  • Type Safety: Strongly bound to configuration classes
  • Auto-completion: IDE support for property names

When to Use:

  • Database connections
  • Server configuration
  • Feature toggles
  • External service URLs
  • Security settings
  • Logging levels
  • Performance tuning

3. Ways of Using Properties

3.1 Property Files Location (Order of Precedence)

# 1. Dev tools global settings (.spring-boot-devtools.properties)
# 2. @TestPropertySource on tests
# 3. @SpringBootTest properties
# 4. Command line arguments
# 5. SPRING_APPLICATION_JSON (inline JSON embedded in env variable)
# 6. ServletConfig init parameters
# 7. ServletContext init parameters
# 8. java:comp/env JNDI attributes
# 9. System.getProperties()
# 10. OS environment variables
# 11. RandomValuePropertySource (random.*)
# 12. Profile-specific application-{profile}.properties
# 13. Application properties (application.properties)
# 14. @PropertySource on @Configuration classes
# 15. Default properties (SpringApplication.setDefaultProperties)
Enter fullscreen mode Exit fullscreen mode

3.2 Property Files Format

application.properties:

# Basic properties
server.port=8080
spring.application.name=myapp

# Database
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=user
spring.datasource.password=pass

# Lists and arrays
spring.profiles.active=dev,test
myapp.servers[0]=server1
myapp.servers[1]=server2
Enter fullscreen mode Exit fullscreen mode

application.yml:

# YAML format (alternative)
server:
  port: 8080
spring:
  application:
    name: myapp
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: user
    password: pass
myapp:
  servers:
    - server1
    - server2
Enter fullscreen mode Exit fullscreen mode

3.3 Accessing Properties in Code

Using @Value:

@Component
public class MyComponent {

    @Value("${server.port}")
    private int serverPort;

    @Value("${myapp.feature.enabled:false}") // default value
    private boolean featureEnabled;

    @Value("${myapp.servers}")
    private List<String> servers;
}
Enter fullscreen mode Exit fullscreen mode

Using @ConfigurationProperties:

@Configuration
@ConfigurationProperties(prefix = "app.config")
public class AppConfig {
    private String name;
    private List<String> servers = new ArrayList<>();
    private Database database = new Database();

    // getters and setters
    public static class Database {
        private String host;
        private int port;
        // getters and setters
    }
}
Enter fullscreen mode Exit fullscreen mode

application.properties:

app.config.name=MyApplication
app.config.servers[0]=server1
app.config.servers[1]=server2
app.config.database.host=localhost
app.config.database.port=3306
Enter fullscreen mode Exit fullscreen mode

3.4 Profile-specific Properties

application-dev.properties:

spring.datasource.url=jdbc:h2:mem:testdb
spring.h2.console.enabled=true
logging.level.com.myapp=DEBUG
Enter fullscreen mode Exit fullscreen mode

application-prod.properties:

spring.datasource.url=jdbc:mysql://prod-db:3306/mydb
logging.level.com.myapp=INFO
management.endpoints.web.exposure.include=health,info
Enter fullscreen mode Exit fullscreen mode

3.5 Conditional Configuration

@Configuration
@ConditionalOnProperty(name = "app.feature.cache.enabled", havingValue = "true")
public class CacheConfig {
    // This configuration only loads if property is set to true
}
Enter fullscreen mode Exit fullscreen mode

4. Common Properties by Category

4.1 Core Spring Properties

# Application basic config
spring.application.name=my-service
spring.profiles.active=dev
spring.main.banner-mode=console
spring.main.lazy-initialization=true

# Internationalization
spring.messages.basename=messages
spring.web.locale=en_US

# File upload
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
Enter fullscreen mode Exit fullscreen mode

4.2 Database Properties (JDBC)

# DataSource
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# Connection pool (HikariCP)
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5

# Embedded database
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
Enter fullscreen mode Exit fullscreen mode

4.3 JPA/Hibernate Properties

# JPA
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.open-in-view=false

# Hibernate specific
spring.jpa.properties.hibernate.jdbc.batch_size=20
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.query.fail_on_pagination_over_collection_fetch=true

# Second-level cache
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
spring.jpa.properties.javax.persistence.sharedCache.mode=ALL
Enter fullscreen mode Exit fullscreen mode

4.4 Web/Server Properties

# Server configuration
server.port=8080
server.servlet.context-path=/api
server.servlet.session.timeout=30m
server.compression.enabled=true
server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json
server.compression.min-response-size=1024

# Tomcat specific
server.tomcat.max-threads=200
server.tomcat.max-connections=10000
server.tomcat.accept-count=100
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms)

# SSL
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=secret
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat
Enter fullscreen mode Exit fullscreen mode

4.5 Security Properties

# Basic Security
spring.security.user.name=admin
spring.security.user.password=secret
spring.security.user.roles=ADMIN,USER

# OAuth2
spring.security.oauth2.client.registration.my-client.client-id=client-id
spring.security.oauth2.client.registration.my-client.client-secret=client-secret
spring.security.oauth2.client.registration.my-client.scope=read,write
spring.security.oauth2.client.registration.my-client.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.my-client.redirect-uri=http://localhost:8080/login/oauth2/code/my-client

# JWT
app.security.jwt.secret=mySecretKey
app.security.jwt.expiration=86400000
Enter fullscreen mode Exit fullscreen mode

4.6 Logging Properties

# Logging levels
logging.level.com.myapp=DEBUG
logging.level.org.springframework.web=INFO
logging.level.org.hibernate=WARN

# Log file
logging.file.name=app.log
logging.file.path=/var/log
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n

# Logback specific
logging.logback.rollingpolicy.max-file-size=10MB
logging.logback.rollingpolicy.max-history=30
Enter fullscreen mode Exit fullscreen mode

4.7 Mail Properties

# SMTP configuration
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=user@gmail.com
spring.mail.password=app-password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

# Mail sender
spring.mail.default-encoding=UTF-8
spring.mail.protocol=smtp
spring.mail.test-connection=false
Enter fullscreen mode Exit fullscreen mode

4.8 Cache Properties

# Cache auto-configuration
spring.cache.type=redis
spring.cache.redis.time-to-live=600000
spring.cache.redis.cache-null-values=true
spring.cache.redis.key-prefix=cache:

# Redis specific
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
spring.redis.timeout=2000

# Caffeine cache
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
Enter fullscreen mode Exit fullscreen mode

4.9 Actuator Properties

# Actuator endpoints
management.endpoints.web.exposure.include=health,info,metrics,env
management.endpoints.web.exposure.exclude=shutdown
management.endpoint.health.show-details=always
management.endpoint.health.show-components=always

# Health indicators
management.health.db.enabled=true
management.health.redis.enabled=true
management.health.diskspace.enabled=true

# Custom info
management.info.env.enabled=true
management.info.build.enabled=true
management.info.git.enabled=true

# Metrics
management.metrics.export.prometheus.enabled=true
management.metrics.distribution.percentiles-histogram.http.server.requests=true
Enter fullscreen mode Exit fullscreen mode

4.10 Thymeleaf Properties

# Thymeleaf template engine
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.cache=false # Set to true in production
spring.thymeleaf.check-template-location=true
Enter fullscreen mode Exit fullscreen mode

4.11 WebSocket Properties

# WebSocket configuration
spring.websocket.servlet.max-session-idle-timeout=300000
spring.websocket.servlet.max-text-message-buffer-size=8192
spring.websocket.servlet.max-binary-message-buffer-size=8192

# STOMP broker
spring.websocket.stomp.relay.host=localhost
spring.websocket.stomp.relay.port=61613
spring.websocket.stomp.broker.relay.enabled=true
Enter fullscreen mode Exit fullscreen mode

4.12 Batch Properties

# Spring Batch
spring.batch.job.enabled=false
spring.batch.job.name=myJob
spring.batch.initialize-schema=always
spring.batch.table-prefix=BATCH_

# Job repository
spring.batch.jdbc.initialize-schema=always
spring.batch.job.repository.isolation-level-for-create=default
Enter fullscreen mode Exit fullscreen mode

4.13 Cloud Properties

# Spring Cloud Config
spring.cloud.config.uri=http://localhost:8888
spring.cloud.config.name=myapp
spring.cloud.config.profile=dev
spring.cloud.config.label=main

# Eureka Client
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}

# Circuit Breaker
resilience4j.circuitbreaker.instances.backend.failure-rate-threshold=50
resilience4j.circuitbreaker.instances.backend.wait-duration-in-open-state=10s
Enter fullscreen mode Exit fullscreen mode

4.14 Compression Properties

# Response compression
server.compression.enabled=true
server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml
server.compression.min-response-size=1024

# Gzip compression for static content
spring.resources.chain.gzipped=true
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
Enter fullscreen mode Exit fullscreen mode

5. Advanced Usage Examples

5.1 Custom Configuration Properties

@Configuration
@ConfigurationProperties(prefix = "app")
@Validated
public class AppProperties {

    @NotBlank
    private String name;

    @Min(1)
    private int maxConnections;

    private List<String> allowedHosts;

    private Security security = new Security();

    // getters and setters

    public static class Security {
        private boolean enabled;
        private String secretKey;
        private long tokenValidity;

        // getters and setters
    }
}
Enter fullscreen mode Exit fullscreen mode

5.2 Profile-based Configuration

@Configuration
@Profile("dev")
public class DevConfig {
    // Development specific beans
}

@Configuration
@Profile("prod")
public class ProdConfig {
    // Production specific beans
}
Enter fullscreen mode Exit fullscreen mode

5.3 Property Validation

@ConfigurationProperties(prefix = "app")
@Validated
public class AppProperties {

    @NotNull
    @URL
    private String serverUrl;

    @Min(1)
    @Max(65535)
    private int serverPort;

    @Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$")
    private String adminEmail;
}
Enter fullscreen mode Exit fullscreen mode

5.4 Dynamic Property Refresh

@RefreshScope
@Component
public class MyRefreshedComponent {

    @Value("${app.dynamic.config}")
    private String dynamicConfig;

    // This value will be refreshed when /actuator/refresh is called
}
Enter fullscreen mode Exit fullscreen mode

6. Best Practices

  1. Use YAML for complex hierarchical configurations
  2. Externalize environment-specific properties
  3. Use sensible default values
  4. Validate configuration properties
  5. Use profile-specific properties for different environments
  6. Keep sensitive data in secure property sources
  7. Use @ConfigurationProperties for type-safe configuration
  8. Document your custom properties

Top comments (0)