Мне нужна быстрая помощь от вас, чтобы исправить небольшую проблему.
В одном из моих проектов (с использованием Spring в качестве основного контейнера) я использую ehcache для кэширования данных. Я использую Spring ehcache annotations project (http://code.google.com/p/ehcache-spring-annotations/) для того же.
Я хочу иметь гибкость, чтобы включать и отключать ehcache на основе внешнего свойства. Я прочитал документацию по ehcache и обнаружил, что он внутренне считывает системное свойство net.sf.ehcache.disabled, и если он установлен в значение true, кеш будет отключен, и они рекомендуют передавать это как -Dnet.sf.ehcache.disabled=true
в командной строке
Я хотел управлять им через внешний файл свойств пружины.
Затем я подумал об установке этого системного свойства в файле контекста моего весеннего приложения, используя MethodInvokingFactoryBean на основе внешнего свойства.
Вот код
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="java.lang.System"/>
<property name="targetMethod" value="getProperties"/>
</bean>
</property>
<property name="targetMethod" value="putAll"/>
<property name="arguments">
<util:properties>
<prop key="net.sf.ehcache.disabled">"${ehcache.disabled}"</prop>
</util:properties>
</property>
</bean>
Очевидно, что ehcache.disabled
контролируется через мой внешний файл свойств.
Сантехника работает отлично, но я думаю, что порядок не на месте. К тому времени, когда контекст приложения устанавливает системное свойство, кеш инициализируется, и когда кеш инициализировался, свойства net.sf.ehcache.disabled
не было, следовательно, кеш не отключается. Когда я запускаю приложение в режиме отладки и пытаюсь получить System.getProperty("net.sf.ehcache.disabled")
после того, как контекст приложения инициализирован, это дает мне правильное значение. (Я пробовал и правда и ложь).
Еще одна вещь, о которой я хочу упомянуть, я использую Spring Wrapper для инициализации моего кэша.
<ehcache:annotation-driven self-populating-cache-scope="method"/>
<ehcache:config cache-manager="cacheManager">
<ehcache:evict-expired-elements interval="20"/>
</ehcache:config>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:configLocation="classpath:ehcache.xml"/>
Я считаю, что отключить кеш не может быть так сложно.
Что мне не хватает? Есть ли простой способ сделать это весной, кроме командной строки?