Подтвердить что ты не робот

Внедрение построителя кеша гуавы Google в bean через Spring

Может ли кто-нибудь предоставить хороший фрагмент, чтобы построить и ввести Google guava CacheBuilder в зависимый bean через Spring xml?

Чтобы обобщить, мне нужно несколько примеров в Spring, которые иллюстрируют построение объектов с использованием шаблона построителя.

4b9b3361

Ответ 1

Пока возможно вызывает произвольные методы в Spring XML с использованием атрибута factory-method, вы обнаружите, что это почти невозможно для цепочечных вызовов типа Builder-Pattern.

Вместо этого используйте такие FactoryBean или конфигурацию контейнера на Java для таких сложных сценариев. Я боюсь, что XML не дойдет до вас.

Ответ 2

С добавлением CacheBuilderSpec в следующем выпуске Guava (выпуск 12) вы сможете создать CacheBuilder bean в xml, используя метод CacheBuilder.from(String spec) static factory.

Это будет выглядеть так:

<bean id="legendaryCacheBuilder"
      class="com.google.common.cache.CacheBuilder"
      factory-method="from">
    <constructor-arg value="maximumSize=42, expireAfterAccess=10m, expireAfterWrite=1h" />
</bean>

Вы даже можете экпортировать строку конфигурации в файл .properties, используя Spring PropertyPlaceholderConfigurer.

До тех пор вы должны использовать решение Sean Patrick Floyd (что также имеет преимущество в том, что оно безопасно для типов).

Ответ 3

Также хотелось добавить, что вы можете использовать Cache Spec непосредственно в Cache Manager, если вас не интересуют разные сборщики кэшей для разных кешей.

Вам не нужно указывать каждый кеш по имени при инициализации диспетчера кэшей, каждый новый запрос для кэша будет строить один на основе предоставленного CacheBuilder или в этом случае с предоставленным Cache Spec (что приводит к соответствующему CacheBuilder).

Вы Spring XML заканчивается чрезвычайно элегантным:

<bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager">
    <property name="cacheSpecification" value="maximumSize=300000,expireAfterWrite=10h" />
</bean>

Также обратите внимание: не забудьте сообщить Spring, что вы используете кеширование, включив что-то вроде этого в конфигурацию приложения xml:

<cache:annotation-driven/>

Что вам нужно, конечно, определить:

xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/cache classpath:org/springframework/cache/config/spring-cache-4.2.xsd"

Если вы не делаете ничего подобного, и вы хотите иметь несколько CacheBuilders для разных вариантов использования, то вы, вероятно, захотите создать свой собственный класс и метод Factory.