Close

Spring - Accessing Environment Properties

[Last Updated: Oct 17, 2022]

What is Environment?

org.springframework.core.env.Environment is an interface representing the environment in which the current application is running.

With Environment instance we can access the properties loaded for the application. Let's understand how can we do that.

Definition of Environment

(Version: spring-framework 5.3.23)
package org.springframework.core.env;
   ........
public interface Environment extends PropertyResolver {
    String[] getActiveProfiles(); 
    String[] getDefaultProfiles(); 
    @Deprecated
    boolean acceptsProfiles(String... profiles); 
    boolean acceptsProfiles(Profiles profiles); 
}

As seen above Environment extends PropertyResolver.

Definition of PropertyResolver

(Version: spring-framework 5.3.23)
package org.springframework.core.env;
   ........
public interface PropertyResolver {
    boolean containsProperty(String key); 
    @Nullable
    String getProperty(String key); 
    String getProperty(String key, String defaultValue); 
    @Nullable
    <T> T getProperty(String key, Class<T> targetType); 
    <T> T getProperty(String key, Class<T> targetType, T defaultValue); 
    String getRequiredProperty(String key) throws IllegalStateException; 
    <T> T getRequiredProperty(String key, Class<T> targetType)
            throws IllegalStateException; 
    String resolvePlaceholders(String text); 
    String resolveRequiredPlaceholders(String text) throws IllegalArgumentException; 
}

Spring attempts to unify all name/value property pairs access into org.springframework.core.env.Environment.

The properties source can be java.util.Properties, loaded from a file or Java system/env properties or java.util.Map.

If we are in the Servlet container environment, the source can be javax.servlet.ServletContext or javax.servlet.ServletConfig.


ConfigurableEnvironment interface

This interface extends Environment and ConfigurablePropertyResolver interfaces. It provides facilities for setting active and default profiles and accessing underlying property sources.

Definition of ConfigurableEnvironment

(Version: spring-framework 5.3.23)
package org.springframework.core.env;
   ........
public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver {
    void setActiveProfiles(String... profiles); 
    void addActiveProfile(String profile); 
    void setDefaultProfiles(String... profiles); 
    MutablePropertySources getPropertySources(); 
    Map<String, Object> getSystemProperties(); 
    Map<String, Object> getSystemEnvironment(); 
    void merge(ConfigurableEnvironment parent); 
}

Definition of ConfigurablePropertyResolver

(Version: spring-framework 5.3.23)
package org.springframework.core.env;
   ........
public interface ConfigurablePropertyResolver extends PropertyResolver {
    ConfigurableConversionService getConversionService(); 
    void setConversionService(ConfigurableConversionService conversionService); 
    void setPlaceholderPrefix(String placeholderPrefix); 
    void setPlaceholderSuffix(String placeholderSuffix); 
    void setValueSeparator(@Nullable String valueSeparator); 
    void setIgnoreUnresolvableNestedPlaceholders(
            boolean ignoreUnresolvableNestedPlaceholders); 
    void setRequiredProperties(String... requiredProperties); 
    void validateRequiredProperties() throws MissingRequiredPropertiesException; 
}

We can get an instance of ConfigurableEnvironment via ConfigurableApplicationContext#getEnvironment() (as we saw in the last tutorial). ConfigurableApplicationContext is a sub interface of org.springframework.context.ApplicationContext.

Accessing properties with Environment

Using methods of org.springframework.core.env.Environment directly is one way to access properties in our applications.

package com.logicbig.example;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import java.util.Map;

public class DefaultSystemSourcesExample {
  public static void main (String[] args) {
      AnnotationConfigApplicationContext context =
                          new AnnotationConfigApplicationContext();
      ConfigurableEnvironment env = context.getEnvironment();
      printSources(env);
      System.out.println("-- System properties --");
      printMap(env.getSystemProperties());
      System.out.println("-- System Env properties --");
      printMap(env.getSystemEnvironment());
  }

  private static void printSources (ConfigurableEnvironment env) {
      System.out.println("-- property sources --");
      for (PropertySource<?> propertySource : env.getPropertySources()) {
          System.out.println("name =  " + propertySource.getName() + "\nsource = " + propertySource
                              .getSource().getClass()+"\n");
      }
  }

  private static void printMap (Map<?, ?> map) {
      map.entrySet()
         .stream().limit(15)
         .forEach(e -> System.out.println(e.getKey() + " = " + e.getValue()));
      System.out.println("-------------");

  }
}

Output

-- property sources --
name = systemProperties
source = class java.util.Properties

name = systemEnvironment
source = class java.util.Collections$UnmodifiableMap

-- System properties --
exec.cleanupDaemonThreads = false
java.runtime.name = Java(TM) SE Runtime Environment
exec.mainClass = com.logicbig.example.DefaultSystemSourcesExample
sun.boot.library.path = D:\programs\java\jdk1.8.0_151\jre\bin
java.vm.version = 25.151-b12
java.vm.vendor = Oracle Corporation
java.vendor.url = http://java.oracle.com/
guice.disable.misplaced.annotation.check = true
path.separator = ;
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg = sun.io
user.country = US
user.script =
sun.java.launcher = SUN_STANDARD
-------------
-- System Env properties --
example-site-projects = D:\project\example-sentence-site
USERDOMAIN_ROAMINGPROFILE = DESKTOP-0E87003
GIT_HOME = D:\programs\Git
PROCESSOR_LEVEL = 6
SESSIONNAME = Console
ALLUSERSPROFILE = C:\ProgramData
PROCESSOR_ARCHITECTURE = AMD64
intellijPath = D:\programs\JetBrains\ideaIC-2021.1.1.win\bin
jvmConfig = \.mvn\jvm.config
PSModulePath = C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
SystemDrive = C:
=ExitCode = 00000001
-------------

As seen in above output, there are two property sources by default, System properties and System Environmental properties. We can add our own property sources as well (next tutorials).

By default, system properties have precedence over environment variables, so if the foo property happens to be set in both places during a call to env.getProperty("foo"), the system property value will 'win' and be returned preferentially over the environment variable. Note that property values will not get merged but rather completely overridden by a preceding entry.


Example Project

Dependencies and Technologies Used:

  • spring-context 5.3.23 (Spring Context)
     Version Compatibility: 3.2.3.RELEASE - 5.3.23 Version List
    ×

    Version compatibilities of spring-context with this example:

    • 3.2.3.RELEASE
    • 3.2.4.RELEASE
    • 3.2.5.RELEASE
    • 3.2.6.RELEASE
    • 3.2.7.RELEASE
    • 3.2.8.RELEASE
    • 3.2.9.RELEASE
    • 3.2.10.RELEASE
    • 3.2.11.RELEASE
    • 3.2.12.RELEASE
    • 3.2.13.RELEASE
    • 3.2.14.RELEASE
    • 3.2.15.RELEASE
    • 3.2.16.RELEASE
    • 3.2.17.RELEASE
    • 3.2.18.RELEASE
    • 4.0.0.RELEASE
    • 4.0.1.RELEASE
    • 4.0.2.RELEASE
    • 4.0.3.RELEASE
    • 4.0.4.RELEASE
    • 4.0.5.RELEASE
    • 4.0.6.RELEASE
    • 4.0.7.RELEASE
    • 4.0.8.RELEASE
    • 4.0.9.RELEASE
    • 4.1.0.RELEASE
    • 4.1.1.RELEASE
    • 4.1.2.RELEASE
    • 4.1.3.RELEASE
    • 4.1.4.RELEASE
    • 4.1.5.RELEASE
    • 4.1.6.RELEASE
    • 4.1.7.RELEASE
    • 4.1.8.RELEASE
    • 4.1.9.RELEASE
    • 4.2.0.RELEASE
    • 4.2.1.RELEASE
    • 4.2.2.RELEASE
    • 4.2.3.RELEASE
    • 4.2.4.RELEASE
    • 4.2.5.RELEASE
    • 4.2.6.RELEASE
    • 4.2.7.RELEASE
    • 4.2.8.RELEASE
    • 4.2.9.RELEASE
    • 4.3.0.RELEASE
    • 4.3.1.RELEASE
    • 4.3.2.RELEASE
    • 4.3.3.RELEASE
    • 4.3.4.RELEASE
    • 4.3.5.RELEASE
    • 4.3.6.RELEASE
    • 4.3.7.RELEASE
    • 4.3.8.RELEASE
    • 4.3.9.RELEASE
    • 4.3.10.RELEASE
    • 4.3.11.RELEASE
    • 4.3.12.RELEASE
    • 4.3.13.RELEASE
    • 4.3.14.RELEASE
    • 4.3.15.RELEASE
    • 4.3.16.RELEASE
    • 4.3.17.RELEASE
    • 4.3.18.RELEASE
    • 4.3.19.RELEASE
    • 4.3.20.RELEASE
    • 4.3.21.RELEASE
    • 4.3.22.RELEASE
    • 4.3.23.RELEASE
    • 4.3.24.RELEASE
    • 4.3.25.RELEASE
    • 4.3.26.RELEASE
    • 4.3.27.RELEASE
    • 4.3.28.RELEASE
    • 4.3.29.RELEASE
    • 4.3.30.RELEASE
    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.2.16.RELEASE
    • 5.2.17.RELEASE
    • 5.2.18.RELEASE
    • 5.2.19.RELEASE
    • 5.2.20.RELEASE
    • 5.2.21.RELEASE
    • 5.2.22.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8
    • 5.3.9
    • 5.3.10
    • 5.3.11
    • 5.3.12
    • 5.3.13
    • 5.3.14
    • 5.3.15
    • 5.3.16
    • 5.3.17
    • 5.3.18
    • 5.3.19
    • 5.3.20
    • 5.3.21
    • 5.3.22
    • 5.3.23

    Versions in green have been tested.

  • JDK 8
  • Maven 3.8.1

Accessing Environment Properties Select All Download
  • spring-default-evn-properties
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • DefaultSystemSourcesExample.java

    See Also