Механизм кэширования пружины очень гибкий и может кэшировать любые методы бобов или бобов в контейнере. Следовательно, этот механизм кэширования может быть кэширован на любом уровне применения Javaee.
Основной уровень пружинного кеша также должен быть реализован с помощью других инструментов кэша, таких как Ehcache (инструмент кэша Hibernate), а верхний слой использует унифицированное программирование API.
Для использования пружинного кеша требуются следующие три шага
Например
<? xml version = "1.0" Encoding = "UTF-8"?> <ehcache> <diskstore path = "java.io.tmpdir" /> <!-Настройка кэша по умолчанию-> <defaultcache maxelementsinmemory = "10000" Eternal = "false" TimeTodleSeconds = "120" 120 "120" maxElementsondisk = "10000000" diskexpiryThreadIntervalseconds = "120" MemoryStoreEvictionPolicy = "lru"/> <!-Настройка кэша с именем пользователями-> <cache name = "users" maxelementsinmemory = "10000" eternal = "false" Overthflowtodisk = "treimeDoidleSeconds =" 300 "300" 300 "300" 300 "300" 300 "300" 300 ". Timetoliveseconds = "600" /> < /ehcache>
Вышеуказанный ehcache.xml настраивает две области кэша. Бобы весной будут кэшированы в этих районах кеша. Как правило, сколько бобов в пружинном контейнере будет определено в Ehcache.
Затем настройте Cache Manager в файле конфигурации Spring следующим образом, где первая фасоль - это фабричный фасоль, используемый для настройки Cachemanager of Ehcache, а второй фасоль - это Cache Manager, настроенный для Spring Cache, поэтому первый фасоль вводится во второй фасоль.
<Cache: Annotation-управляемый Cache-Manager = "cachemanager" /> <!-Настройка ehcache cachemanager, чтобы указать местоположение файла ehcache.xml через configlocation-> <bean id = "ehcachemanager" p: configlocation = "classpath: ehcache.xml" p: fareed = "false" /> <! Ehcache Cachemanager в Bean Manager-> <bean id = "cachemanager" p: cachemanager-ref = "ehcachemanager"> </bean>
Вот полная конфигурация пружины.
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: p = "http://www.springframework.org/schema/p" xmlns: cache = "http://www.springframework.org/schema/cache" xmlns: context = "http://wwww.springframe.orschema:" http://wwww.springframe.orschema: "http://wwww.springform. xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.spramework.org/schema/ccema http://www.springframework.org/schema/cache/spring-cache-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.0.x.> base-package = "com.service" /> <cache: Annotation-управляемый cache-manager = "cachemanager" /> <!-configure ehcache cachemanager Укажите местоположение файла ehcache.xml через configlocation-> <bean id = "ehcachemanager" p: confighate = "classpath: ehcach.xml" /pared yhcachemanager "! Настройте Cachemanager Ehcache на основе EHCache Cache Manager и введите Cachemanager Ehcache в Bean Manager-> <Bean id = "cachemanager" P: cachemanager-ref = "ehcachemanager"> </bean> </beans>
Следующее будет использовать @Cacheable в качестве примера для демонстрации использования пружины на основе кэша ehcache. Cacheable используется для изменения классов или методов. Если класс будет изменен, все методы в классе будут кэшированы.
Кэш на уровне класса
Например, есть следующие классы бобов,
@Service ("userservice") @cachable (value = "users") открытый класс пользователи userserviceimpl реализует userservice {@override public user getUsersbynameandage (string name, int age) {System.out.println ("выполнение getUsersbynameandage () .."); вернуть нового пользователя (имя, возраст); } @Override public user getAnotherUser (string name, int age) {system.out.println ("выполнение getanotherUser () .."); вернуть нового пользователя (имя, возраст); }}Классный кэш будет кэшировать все методы в классе. После кэша программа вызывает любой метод экземпляра этого класса. Пока прошедшие параметры одинаковы, пружина на самом деле не будет выполнять метод, но будет напрямую искать кэшированные данные на основе пропущенных параметров!
Например, используйте кэшированные данные, как ниже.
public static void test2 () {ApplicationContext ctx = new ClassPathxMlapplicationContext ("beans.xml"); Userservice us = ctx.getbean ("userservice", userservice.class); Пользователь U1 = US.GetUsersBynameAndage ("Zhang San", 50); // Поскольку один и тот же параметр используется, когда метод пользователя -сервиса называется во второй раз, реальный метод не будет выполнен, // Spring напрямую будет искать данные по параметрам от пользователя кэша u2 = us.getAnotherUser ("Zhang San", 50); System.out.println (U1 == U2); }Результат вывода,
Getusersbynameanddage () выполняется ..
истинный
Как вы можете видеть, вышеупомянутый getAnotherUser () фактически не выполняется, потому что пропущенные параметры такие же, как параметры, передаваемые предыдущим методом, поэтому пружина непосредственно исходит из данных области кэша.
В дополнение к требуемому значению атрибута, аннотация @Cacheable в классе бобов выше также имеет ключ, условие и без атрибутов. Последние три используются для установки политики пружинного хранения. Для классов на основе классов Spring использует параметры, передаваемые в методе в качестве ключа для поиска результатов в кэше по умолчанию.
Конечно, мы также можем изменить стратегию ключа и позволить Spring следовать другим стандартам, например, является ли первый параметр таким же, как и ключ, и поиск результатов в кеше.
Изменить приведенный выше класс бобов следующим образом,
@Service ("userservice") @cachable (value = "users", key = "#name") public class userserviceimpl реализует userservice {@override public user getUsersbynameAndage (string, int age) {Это означает, что мы передаем в том же именем, Spring на самом деле не выполнит метод. Только когда имя отличается от того, что метод будет выполнен, например,, например,
public static void test2 () {ApplicationContext ctx = new ClassPathxMlapplicationContext ("beans.xml"); Userservice us = ctx.getbean ("userservice", userservice.class); Пользователь U1 = US.GetUsersBynameAndage ("Zhang San", 50); // После изменения параметра ключа @cachable на key = "#name", можно будет выполнить следующий метод. Пользователь U2 = US.GETANOTHERUSER ("li Si", 50); System.out.println (U1 == U2); } Вы можете видеть, что на этот раз метод getAnotherUser() был выполнен.
1 getusersbynameanddage () выполняется ..
2 getanotheruser () выполняется ..
3 ложь
Например, мы также можем установить свойство условия,
@Service ("userservice") @cachable (value = "users", condity = "#age <100") открытый класс userserviceimpl реализует userservice {@override public user getUsersbynameandage (string name, int age) {Таким образом, для следующего кода ни один метод не будет кэширован. Spring выполняет реальный метод, чтобы получить результат каждый раз.
public static void test2 () {ApplicationContext ctx = new ClassPathxMlapplicationContext ("beans.xml"); Userservice us = ctx.getbean ("userservice", userservice.class); Пользователь U1 = US.GETUSERSBYNAMANDAGE ("Zhang San", 500); Пользователь U2 = US.GETANOTHERUSER ("li Si", 500); System.out.println (U1 == U2); }Результаты исполнения,
Getusersbynameanddage () выполняется ..
Getanotheruser () выполняется ..
ЛОЖЬ
Кэш на уровне метода будет работать только для метода. Различные методы могут устанавливать ненужные области кэша, такие как следующие,
@Service ("userservice") открытый класс userserviceimpl реализует userservice {@cachable ("users1") @override public user getUsersbynameAndage (string name, int age) {system.out.println ("execution getUsersbynameandage () .."); вернуть нового пользователя (имя, возраст); } @Cachable ("users2") @Override public user getAnotherUser (string name, int age) {System.out.println ("getanotherUser () .."); вернуть нового пользователя (имя, возраст); }}Используйте следующий тестовый код,
public static void test2 () {ApplicationContext ctx = new ClassPathxMlapplicationContext ("beans.xml"); Userservice us = ctx.getbean ("userservice", userservice.class); // В первый раз, когда метод будет выполнен, метод будет выполнен и кэширован пользователем u1 = us.getUsersbynameandage ("Zhang San", 500); // Хотя следующий метод проходит одинаковые параметры, поскольку эти два метода находятся в разных областях кэша, данные кэша не могут быть использованы. Пользователь U2 = US.GETANOTHERUSER ("Zhang San", 500); System.out.println (U1 == U2); // Вышеуказанное было кэшировано, и оно не будет выполнено здесь. Используйте кэш напрямую. Пользователь U3 = US.GETANOTHERUSER ("Zhang San", 500); System.out.println (U3 == U2); }Результаты исполнения,
Getusersbynameanddage () выполняется ..
Getanotheruser () выполняется ..
ЛОЖЬ
истинный
Метод, модифицированный @cacheevict, может использоваться для очистки кэша, и следующие свойства могут быть указаны с использованием @CacheEvict .
Allentries, чтобы очистить всю область кеша
Перед включением: следует ли очистить кэш перед выполнением метода. По умолчанию будет очистить его только после успешного выполнения метода.
Условие и ключ, то же значение, что и в @Cacheable .
Следующая демонстрация проста.
@Service ("userservice")@cachable ("users") открытый класс пользователь userserviceimpl реализует userservice {@override public user getUsersbynameandage (string name, int age) {System.out.println ("Cerforming getUsersBynameAndage () ..") возвращает новый пользователь (age); {System.out.println («Выполнение getanotherUser () ..»); вернуть новый пользователь (имя, возраст);} // Указание четкого кэша в соответствии с имени и возрастными параметрами @cacheevict (value = "users") public void evictuser (String name, int age) {System.out.println ("-очищение соответствующего счета из"+name) {syster. Очистка всех кэшированных данных в области пользовательского кэша @cacheevict (value = "users", allentries = true) public void evictall () {system.out.println ("-очистить весь кэш-");}}Ниже приведен тестовый класс,
public static void test2 () {ApplicationContext ctx = new ClassPathxMlapplicationContext ("beans.xml"); Userservice us = ctx.getbean ("userservice", userservice.class); // Система будет кэшировать два метода пользователя u1 = us.getusersbynameandage ("Zhang San", 500); Пользователь U2 = US.GETANOTHERUSER ("li Si", 400); // Вызов метод EvictUser (), чтобы очистить данные, указанные в буфере US.EvictUser ("li Si", 400); // Очистить Li Si, 400 до того, как данные, возвращаемые следующим методом, снова будут кэшированы пользователем u3 = us.getanotherUser ("li si", 400); System.out.println (US == U3); // FALSE // Данные Zhang San и 500 были кэшированы ранее, и следующий метод не будет повторно повторно, и данные в кэше будут непосредственно извлечены пользователем u4 = us.getAnotherUser ("Zhang San", 500); System.out.println (U1 == U4); // вывод true // очистить весь кэш us.evictall (); // Поскольку весь кэш был очищен, следующим кодом будет повторно предъявить пользователь u5 = us.getanotheruser ("Zhang San", 500); Пользователь U6 = US.GETANOTHERUSER ("li Si", 400); System.out.println (U1 == U5); // вывод false System.out.println (u3 == u6); // Выход FALSE}Результаты исполнения,
Getusersbynameanddage () выполняется ..
Getanotheruser () выполняется ..
-очистить кэш, соответствующий Li Si, 400-
Getanotheruser () выполняется ..
ЛОЖЬ
истинный
-очистить весь кэш-
Getanotheruser () выполняется ..
Getanotheruser () выполняется ..
ЛОЖЬ
ЛОЖЬ
Вышеуказанное посвящено примеру механизма кэширования весеннего кэширования в этой статье, я надеюсь, что он будет полезен для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!