Как создать Singleton Bean, который будет содержать статическую хэш-карту

Мне нужно поделиться статическими хэш-картами, которые будут инициализированы во время выполнения с использованием Spring 3.1.

Мне нужно создать настоящий одноэлементный компонент (не обязательно одноэлементный), который будет содержать все мои статические хэш-карты.

Хеш-карту можно будет изменять также во время выполнения, и она должна быть доступна для всех моих весенних компонентов.

  1. bean-компонент, содержащий статическую карту, должен быть активен, пока работает приложение
  2. bean-компонент должен быть доступен для всех spring bean-компонентов.
  3. хэш-карты должны быть параллельными и потокобезопасными. Хэш-карта может иметь около 100 записей и будет доступна с очень высокой скоростью.

Как я мог этого добиться? Заранее спасибо,


person rayman    schedule 19.07.2012    source источник
comment
В чем проблема с обычным одноэлементным компонентом области видимости, содержащим ConcurrentHashMaps? Почему карты должны быть статичными?   -  person Kevin    schedule 19.07.2012
comment
Нет проблем с обычным одноэлементным компонентом, за исключением того факта, что мне нужно, чтобы этот компонент был жив, пока живет мое приложение.   -  person rayman    schedule 22.07.2012
comment
Под настоящим одноэлементным компонентом вы имели в виду постоянное хранилище для данных (после выключения сервера и запуска данные запоминаются) или просто создаете новую хэш-карту после запуска сервера? Если это второй случай, одноэлементная область прекрасно подходит.   -  person Xaerxess    schedule 24.07.2012


Ответы (2)


Я согласен с комментарием @Kevin (ConcurrentHashMap beans), но только что нашел хорошее дополнение к Spring 3.1: ConcurrentMapCacheFactoryBean. Документы говорят:

FactoryBean для простой настройки ConcurrentMapCache при использовании в контейнере Spring.

Я также нашел эту запись в блоге , который предлагает использовать bean-компонент с аннотацией @Cacheable:

<bean id="cacheManager"
        class="org.springframework.cache.support.SimpleCacheManager">
    <property name="caches">
        <set>
            <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
                  p:name="default"/>
        </set>
    </property>
</bean>

Не пробовал, но кажется хорошо интегрированным с материалом Spring.

person Xaerxess    schedule 19.07.2012
comment
Но зачем мне здесь кеширование? просто нужен синглтон, который будет содержать статические данные доступа, которые можно изменить. - person rayman; 22.07.2012

я не на 100% знаю о ваших потребностях, но вы можете создать свою собственную область действия по разделу 3.5.5 Пользовательские области действия, это обеспечит чистый одноэлементный экземпляр и возможность внедрения во все bean-компоненты. и, возможно, вы можете решить потокобезопасность, используя правильный синхронизированный метод или карту

person Jigar Parekh    schedule 19.07.2012
comment
Могу ли я создать чистый инъекционный экземпляр singleton без использования настраиваемых областей? не слишком ли это дорого для этого? - person rayman; 22.07.2012
comment
почему вы думаете, что это может быть накладным? - person Jigar Parekh; 23.07.2012
comment
Потому что я уверен, что уже есть известная область\способ, который может сделать bean-компонент как синглтон и получить глобальный доступ. это довольно распространенная функция во фреймворках. - person rayman; 23.07.2012