키가 고유 한 접두어로 시작하는 모든 속성 (예 : "log4j.appender."로 시작하는 모든 속성)을 검색하고 다음 코드 (Java 8의 스트림 및 람다 사용)를 작성해야했습니다.
public static Map<String,Object> getPropertiesStartingWith( ConfigurableEnvironment aEnv,
String aKeyPrefix )
{
Map<String,Object> result = new HashMap<>();
Map<String,Object> map = getAllProperties( aEnv );
for (Entry<String, Object> entry : map.entrySet())
{
String key = entry.getKey();
if ( key.startsWith( aKeyPrefix ) )
{
result.put( key, entry.getValue() );
}
}
return result;
}
public static Map<String,Object> getAllProperties( ConfigurableEnvironment aEnv )
{
Map<String,Object> result = new HashMap<>();
aEnv.getPropertySources().forEach( ps -> addAll( result, getAllProperties( ps ) ) );
return result;
}
public static Map<String,Object> getAllProperties( PropertySource<?> aPropSource )
{
Map<String,Object> result = new HashMap<>();
if ( aPropSource instanceof CompositePropertySource)
{
CompositePropertySource cps = (CompositePropertySource) aPropSource;
cps.getPropertySources().forEach( ps -> addAll( result, getAllProperties( ps ) ) );
return result;
}
if ( aPropSource instanceof EnumerablePropertySource<?> )
{
EnumerablePropertySource<?> ps = (EnumerablePropertySource<?>) aPropSource;
Arrays.asList( ps.getPropertyNames() ).forEach( key -> result.put( key, ps.getProperty( key ) ) );
return result;
}
myLog.debug( "Given PropertySource is instanceof " + aPropSource.getClass().getName()
+ " and cannot be iterated" );
return result;
}
private static void addAll( Map<String, Object> aBase, Map<String, Object> aToBeAdded )
{
for (Entry<String, Object> entry : aToBeAdded.entrySet())
{
if ( aBase.containsKey( entry.getKey() ) )
{
continue;
}
aBase.put( entry.getKey(), entry.getValue() );
}
}
시작점은 포함 된 PropertySource를 반환 할 수있는 ConfigurableEnvironment입니다 (ConfigurableEnvironment는 Environment의 직계 하위 항목입니다). 다음과 같이 자동 배선 할 수 있습니다.
@Autowired
private ConfigurableEnvironment myEnv;
매우 특별한 종류의 속성 소스 (예 : 스프링 자동 구성에서 일반적으로 사용되지 않는 JndiPropertySource)를 사용하지 않는 경우 환경에있는 모든 속성을 검색 할 수 있습니다.
구현은 스프링 자체가 제공하는 반복 순서에 의존하고 처음 발견 된 속성을 취하며 나중에 발견 된 동일한 이름의 모든 속성은 삭제됩니다. 이렇게하면 환경이 속성을 직접 요청한 것과 동일한 동작을 보장해야합니다 (첫 번째 발견 된 속성 반환).
또한 반환 된 속성은 $ {...} 연산자가있는 별칭을 포함하는 경우 아직 확인되지 않습니다. 특정 키를 확인하려면 환경에 직접 다시 문의해야합니다.
myEnv.getProperty( key );