Могу ошибаться, но мне кажется, что всем известный Spring Framework достиг своего пика с версией 2.5 (когда ввели активное использование аннотаций), а дальше идет по сути «шлифовка» — даже мажорный релиз 3.0 не так уж и велик.
отличается от 2,5. То же самое можно сказать и о предстоящий 3.1 - небольшие улучшения, настройки - но не более того.
Однако одна возможность в 3.1 мне показалась особенно интересной — кэширование.
В любом приложении, которое мы разрабатываем, мы можем в какой-то момент столкнуться с проблемой производительности.
Одним из способов решения проблем является кэширование.
Естественно, вы можете кэшировать данные, возвращаемые из базы данных (Hibernate — самый используемый в Java и так делает это) — но гораздо интереснее кэшировать значения, возвращаемые с «сервисного» уровня.
Вычисление таких значений может быть достаточно трудоемким, предполагающим множество обращений к базе данных, другим сервисам и вычислениям — и соответственно, кэширование на этом уровне может привести к более значимым результатам.
В Spring Framework 3.1 это можно сделать с помощью аннотации @Кэшируемый На самом деле, кэширование на уровне сервиса раньше можно было реализовать в Spring Framework, но теперь это станет намного проще.
Кэширование значений
Например, если при профилировании вы узнали, что какой-то метод «тупой», например (как в документации) метод возврата книги по ISBN: public Book findBook(ISBN isbn) {.
}
Теперь, чтобы закешировать значения, возвращаемые этим методом, достаточно добавить аннотацию:
@Cacheable("books")
public Book findBook(ISBN isbn) {.
}
Эта аннотация повесит сам перехватчик, создаст ключ по параметрам, проверит, есть ли значение в кеше, а если нет, вызовет метод и закеширует результат. И все это? Почти, для полноты нужно:
Настройте кеширование в приложении
Это делается в XML-файле конфигурации контекста приложения: <beans xmlns=" http://www.springframework.org/schema/beans " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance " xmlns:cache="http://www.springframework.org/schema/cache " xsi:schemaLocation="http://www.springframework.org/schema/beans www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cache www.springframework.org/schema/cache/spring-cache.xsd ">
<cache:annotation-driven />
и настраиваем кэш-менеджер — например, самый простой (с помощью ConcurrentMap)
<bean class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean" p:name="default"/>
<bean class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean" p:name="books"/>
или ehcache (можно использовать другие реализации):
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhcacheCacheManager" p:cache-manager="ehcache"/>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache.xml"/>
Очистка кэша
Кэшировать данные нужно аккуратно — это всегда потенциальный источник ошибок, когда данные обновились, а кэша нет и приложение использует устаревшие данные.
Очистку кеша можно также выполнить с помощью аннотации — @CacheEvict: @CacheEvict(value = "books", allEntries=true)
public void loadBooks(InputStream batch)
Вот и все.
Только? Я так думаю.
На самом деле механизм кэширования достаточно гибкий, есть ряд дополнительных возможностей (таких как написание собственных аннотаций, генерация ключей и многое другое.
Но основной функционал выглядит таким простым.
Теги: #spring framework #кэширование #java
-
Как Получить Любой Символ В Gnome
19 Oct, 24 -
Gwt + Спящий Режим + Отправка
19 Oct, 24 -
Как Внедрить Jabra В Свой Телефон
19 Oct, 24