Home [Spring] 1.13.2. PropertySource Abstraction
Post
Cancel

[Spring] 1.13.2. PropertySource Abstraction

1.13.2. PropertySource Abstraction

Spring’s Environment abstraction provides search operations over a configurable hierarchy of property sources. Consider the following listing:

  • 스프링의 Environment 추상화는 property sources의 구성 가능한 계층 구조(configurable hierarchy)에서 검색 작업(search operations)을 제공한다. 다음 목록을 보자.
1
2
3
4
val ctx = GenericApplicationContext()
val env = ctx.environment
val containsMyProperty = env.containsProperty("my-property")
println("Does my environment contain the 'my-property' property? $containsMyProperty")

In the preceding snippet, we see a high-level way of asking Spring whether the my-property property is defined for the current environment. To answer this question, the Environment object performs a search over a set of PropertySource objects. A PropertySource is a simple abstraction over any source of key-value pairs, and Spring’s StandardEnvironment is configured with two PropertySource objects — one representing the set of JVM system properties (System.getProperties()) and one representing the set of system environment variables (System.getenv()).

  • 앞의 snippet에서 스프링에게 현재 환경에 대해 my-property 속성이 정의되어 있는지 여부를 묻는 high-level의 방법을 볼 수 있다.
  • 이 질문에 답하기 위해 Environment 개체는 PropertySource 개체 집합에 대해 검색을 수행한다.
  • PropertySource는 모든 키-값 쌍의 소스에 대한 단순한 추상화이며, 스프링의 StandardEnvironment는 두 개의 PropertySource 개체로 구성된다.
  • 하나는 JVM 시스템 속성 집합(System.getProperties())을 나타내고 다른 하나는 시스템 환경 변수 집합(System.getenv())을 나타낸다.

These default property sources are present for StandardEnvironment, for use in standalone applications. StandardServletEnvironment is populated with additional default property sources including servlet config and servlet context parameters. It can optionally enable a JndiPropertySource. See the javadoc for details.

  • 이러한 기본 속성 소스는 StandardEnvironment 용으로, 독립 실행형 애플리케이션에서 사용하기 위해 존재한다.
  • StandardServletEnvironment 는 서블릿 구성 및 서블릿 컨텍스트 매개 변수를 포함한 추가 기본 속성 소스로 채워진다.
  • 선택적으로 JndiPropertySource 를 활성화할 수 있다.
  • 자세한 내용은 javadoc을 참고하자.

Concretely, when you use the StandardEnvironment, the call to env.containsProperty("my-property") returns true if a my-property system property or my-property environment variable is present at runtime.

  • 구체적으로 StandardEnvironment를 사용할 경우, 실행 시 my-property 시스템 속성 또는 my-property 환경 변수가 있는 경우 env.containsProperty("my-property") 호출이 true로 반환된다.

The search performed is hierarchical. By default, system properties have precedence over environment variables. So, if the my-property property happens to be set in both places during a call to env.getProperty("my-property"), the system property value “wins” and is returned. Note that property values are not merged but rather completely overridden by a preceding entry.

For a common StandardServletEnvironment, the full hierarchy is as follows, with the highest-precedence entries at the top:

  1. ServletConfig parameters (if applicable — for example, in case of a DispatcherServlet context)

  2. ServletContext parameters (web.xml context-param entries)

  3. JNDI environment variables (java:comp/env/ entries)

  4. JVM system properties (-D command-line arguments)

  5. JVM system environment (operating system environment variables)

  • 수행된 검색은 계층적(hierarchical)이다.
  • 기본적으로 시스템 속성은 환경 변수보다 우선한다.
  • 따라서 env.getProperty("my-property")로 호출하는 동안 my-property 속성이 두 위치에 모두 설정되면 시스템 속성 값이 “wins”되고 반환된다.
  • 속성 값은 병합되지 않고 이전 항목에 의해 완전히 재정의된다는 점에 유의하자.

  • 공통의 StandardServletEnvironment의 경우 전체 계층은 다음과 같으며, 가장 높은 사전 준비 항목이 맨 위에 있다.
  1. ServletConfig 매개 변수(해당하는 경우, 예를 들어 DispatcherServlet 컨텍스트의 경우)

  2. ServletContext 매개 변수(web.xml context-param 항목)

  3. JNDI 환경 변수(java:comp/env/ 항목)

  4. JVM 시스템 속성(-D command-line arguments)

  5. JVM 시스템 환경(운영 체제 환경 변수)

Most importantly, the entire mechanism is configurable. Perhaps you have a custom source of properties that you want to integrate into this search. To do so, implement and instantiate your own PropertySource and add it to the set of PropertySources for the current Environment. The following example shows how to do so:

  • 가장 중요한 것은 전체 메커니즘을 구성할 수 있다는 것이다.
  • 우리가 이 검색에 통합하기를 원하는 custom source of perperties를 우리가 가지고 있을 수 있다.
  • 그렇게 하려면 자신의 PropertySource를 구현 및 인스턴스화하고 이를 현재 EnvironmentPropertySources 집합에 추가하자.
  • 다음 예제는 이를 수행하는 방법을 보여준다.
1
2
3
val ctx = GenericApplicationContext()
val sources = ctx.environment.propertySources
sources.addFirst(MyPropertySource())

In the preceding code, MyPropertySource has been added with highest precedence in the search. If it contains a my-property property, the property is detected and returned, in favor of any my-property property in any other PropertySource. The MutablePropertySources API exposes a number of methods that allow for precise manipulation of the set of property sources.

  • 앞의 코드에서 MyPropertySource는 검색에서 가장 높은 우선순위로 추가되었다.
  • my-property 속성을 포함하는 경우 해당 속성은 다른 PropertySourcemy-property 속성에 유리하게 탐지되어 반환된다.
  • MutablePropertySources API는 property sources 집합을 정밀하게 조작할 수 있는 여러 가지 methods를 보여준다.

References

This post is licensed under CC BY 4.0 by the author.

[Spring] 1.13.1. Bean Definition Profiles

[Spring] 1.13.3. Using @PropertySource