2013-02-08 1 views
0

Механизм пружинного пружин очень чистый и надежный, к сожалению, он работает только с файлами Spring.Как вызывать текущий атрибут свойства Spring на ресурс в Java-коде?

Я использую EhCahe, и я хочу использовать механизм запирания в файле ehcache.xml. У меня есть собственный фасоль для EhCache, и я могу предоставить эту конфигурацию библиотеки как InputStream. Так что все, что мне нужно сделать, чтобы достичь своей цели является:

  • чтения содержимого XML-файл из
  • классам
  • доступа свойство заполнитель для текущего файла spring.xml (те, что мой боб настроен)
  • ссылаться заполнитель на ресурс чтения
  • дать ресурс обратно в библиотеку, как InputStream

так что мой вопрос, как сделать это, так как компактны как Spr ing позволяет это? Я бы хотел избежать создания самих заполнителей, поэтому код будет делать как можно меньше «магии», поэтому я хотел бы использовать конфигурацию свойств из xml-файла.

ответ

0

Ehcache имеет api для программного определения новых кешей. Почему вы не могли создать фасоль, которая начинается вместе с весной и заполняется автоматически? Таким образом, вам не нужно создавать automatich EhCache.xml, но вы можете определить все необходимые вам кеши в файле весеннего контекста.

+0

Вы имеете в виду переписать ehcache.xml в формат bean.xml bean? Это по-прежнему вариант, однако шокирующий для людей, используемых в формате ehcache.xml, заставляя их учиться «новому». –

1

Ehcache поддерживает системное свойство заполнитель замену в файле ehcache.xml, поэтому один вариант для копирования значения заполнителей Spring в свойствах системы, чтобы они могли быть использованы ссылки в файле ehcache.xml:

В контексте весеннего XML ...

<!-- Copy Spring placeholder value to System props --> 
<bean id="systemProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" value="#{@systemProperties}" /> 
    <property name="targetMethod" value="putAll" /> 
    <property name="arguments"> 
     <util:properties> 
      <prop key="cache.ttl">${cache.ttl}</prop> 
     </util:properties> 
    </property> 
</bean> 

Затем в файле ehcache.xml теперь вы можете использовать ${cache.ttl} заполнитель заселена выше:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> 
    <cache name="myCache" timeToLiveSeconds="${cache.ttl}" maxElementsInMemory="1000" overflowToDisk="false" /> 
</ehcache> 
0

Нет необходимости использовать свойства sytem. Однако вам придется разрешать заполнители во время сборки.

Поставь свойства объекта, как это:

<bean id="cacheProperties" class="java.util.Properties"> 
    <constructor-arg> 
     <props> 
      <prop key="prop1">#{prop1}</prop> 
      <prop key="prop2">#{prop2}</prop> 
     </props> 
    </constructor-arg> 
</bean> 

и установить их в пользовательский PlaceHolderHelper:

<bean id="cachePlaceholderHelper" 
     class="com.PlaceholderHelper" depends-on="cacheProperties"> 
    <property name="configFileResource" value="classpath:cacheConfig.xml"/> 
    <property name="properties" ref="cacheProperties"/> 
</bean> 

PlaceholderHelper может выглядеть примерно так:

private Resource configFileResource; 
private Properties properties; 
private Resource resolvedConfigResource; 

@PostConstruct 
public void replace() throws IOException { 
    PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper("${", "}"); 

    if (this.properties != null && this.configFileResource != null) { 
     File file = this.configFileResource.getFile(); 
     String content = FileUtils.readFileToString(file); 
     String result = helper.replacePlaceholders(content, this.properties); 
     File resolvedCacheConfigFile = new File("resolvedCacheConfig"); 
     FileUtils.write(resolvedCacheConfigFile, result); 

     resolvedConfigResource = new FileSystemResource(resolvedCacheConfigFile); 
     logger.info(String.format("Placeholders in file %s were replaced.", file.getName())); 
    } 
} 

Изменить p: configLocation to resolv ed resource:

p:configLocation="#{cachePlaceholderHelper.resolvedConfigResource} 

Теперь вы можете использовать выражение $ {prop1} в любом месте XML.

 Смежные вопросы

  • Нет связанных вопросов^_^