缓存框架Ehcache的使用

为何使用Ehcache而不使用redis缓存呢?       
1.Shiro默认对ehcache的支持. 2.在后台管理系统中ehcache使用广泛.css

1.Spring整合Ehcachehtml

第一步:在 common_parent 导入 ehcache maven 坐标,  默认已经导好包:Spring整合ehcache:Spring-context-support包java

<!-- 缓存 -->
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>2.6.11</version>
    </dependency>

第二步:使用ehcache,导入ehcache.xml配置文件  :  解压核心包,将ehcache-failsafe复制更名ehcache.xmlweb

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <diskStore path="java.io.tmpdir"/>

    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
    <!-- 自定义缓存区-->
    <cache name="bos" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </cache>
    
    <cache name="standard" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </cache>
    
</ehcache>
ehcache.xml

第三步:配置Spring整合ehcache:将ehcacheManager交给Spring管理redis

:默认 Ehcache 提供 CacheManager 提供 addCache(),getCache(),加入缓存区或查询缓存区方法,原理是EhCacheManagerFactoryBean里构造Map<key,value>.spring

<!-- spring管理ehcache缓存管理器 -->
    <bean id="ehcacheManager" 
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache.xml" />
    </bean>

2 . 配置shiro整合ehcache完成对受权数据缓存  apache

第四步: 配置 shiro 封装缓存管理器缓存

<!-- shiro整合ehcache 缓存管理器 -->
    <bean id="shiroCacheManager" 
        class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManager" ref="ehcacheManager" />
    </bean>

第五步: 将 shiro 的缓存管理器,注入到安全管理器中在app-shiro.xml加入
应用程序代码 – Subject – SecurityManager – Realm (查询认证和受权数据)安全

<!-- 安全管理器  -->
    <bean id="securityManager" 
        class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="bosRealm" />
        <property name="cacheManager" ref="shiroCacheManager" />
    </bean>

第六步: 对认证数据、受权数据 哪些进行缓存 ?   用了缓存,实体类须要序列化app

<!-- 配置Realm -->
    <bean id="bosRealm" class="cn.itcast.bos.realm.BosRealm">
        <!-- 缓存区的名字 就是 ehcache.xml 自定义 cache的name -->
        <property name="authorizationCacheName" value="bos" />
    </bean>

3 . Ehcache   对普通业务数据进行缓存

一 .配置 spring 缓存管理器,封装 ehcache 自带 CacheManager

<!-- spring缓存管理器,整合ehcache -->
    <bean id="springCacheManager" 
        class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcacheManager" />
    </bean>

二. 在 applicationContext-cache.xml 引入 cache 名称空间
三 .<!-- 激活spring 缓存注解 -->
<cache:annotation-driven cache-manager="springCacheManager"/>

四 在被 spring 管理 bean 对象方法上 使用@Cacheable 、@CacheEvict
@Cacheable 应用缓存区,对方法返回结果进行缓存 ---- 用于查询方法
@CacheEvict 清除缓存区数据 --- 用于 增长、修改、删除 方法

<cache name="standard" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </cache>

对实体类进行序列化,实现类配置@Cacheable

 

 

配置总结以下:  在applicationContext.xml引入applicationContext.xml

<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/data/jpa 
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
  
    <!-- 扫描 @Server @Controller @Repository -->
    <context:component-scan base-package="cn.itcast"/>

    <!-- 加载properties文件 -->
    <context:property-placeholder location="classpath:config.properties" />
    
    <!-- 引入外部数据文件 -->
    <import resource="applicationContext-dataSource.xml"/>
    
    <!-- 引入WebService配置 -->
    <import resource="applicationContext-webService.xml"/>
    
    <!-- 引入quartz配置 -->
    <import resource="applicationContext-quartz.xml"/>
    
    <!-- 引入 mq配置  -->
    <import resource="applicationContext-mq.xml"/>
    
    <!-- 引入 elasticsearch 配置  -->
    <import resource="applicationContext-elasticsearch.xml"/>
    
    <!-- 引入 shiro权限控制配置 -->
    <import resource="applicationContext-shiro.xml"/>
    
    <!-- 引入cache 配置 -->
    <import resource="applicationContext-cache.xml"/>
</beans>
applicationContext.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <diskStore path="java.io.tmpdir"/>

    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
    <!-- 自定义缓存区-->
    <cache name="bos" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </cache>
    
    <cache name="standard" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </cache>
    
</ehcache>
ehcache
<?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:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation="         http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/cache 
        http://www.springframework.org/schema/cache/spring-cache.xsd ">
 
     <!-- 缓存配置  -->
    <bean id="ehCacheManager" 
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache.xml" />
    </bean>
    
    <!-- shiro封装cacheManager -->
    <bean id="shiroCacheManager" 
        class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManager" ref="ehCacheManager" />
    </bean>
    
    <!-- spring 封装ehcache缓存管理器  -->
    <bean id="springCacheManager" 
        class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehCacheManager" />
    </bean>
    
    <!-- 激活spring 缓存注解 -->
    <cache:annotation-driven cache-manager="springCacheManager"/>
    
</beans>
applicationContext-cache.xml
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/data/jpa 
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
    
    <!-- 配置Shiro核心Filter  --> 
    <bean id="shiroFilter" 
        class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 安全管理器 -->
        <property name="securityManager" ref="securityManager" />
        <!-- 未认证,跳转到哪一个页面  -->
        <property name="loginUrl" value="/login.html" />
        <!-- 登陆页面页面 -->
        <property name="successUrl" value="/index.html" />
        <!-- 认证后,没有权限跳转页面 -->
        <property name="unauthorizedUrl" value="/unauthorized.html" />
        <!-- shiro URL控制过滤器规则  -->
        <property name="filterChainDefinitions">
            <value>
                /login.html* = anon /user_login.action* = anon /validatecode.jsp* = anon /css/** = anon /js/** = anon /images/** = anon /services/** = anon /pages/base/courier.html* = perms[courier:list] /pages/base/area.html* = roles[base] /** = authc </value> </property> </bean> <!-- 安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="bosRealm" /> <property name="cacheManager" ref="shiroCacheManager" /> </bean> <!-- 配置Realm --> <bean id="bosRealm" class="cn.itcast.bos.realm.BosRealm"> <!-- 缓存区的名字 就是 ehcache.xml 自定义 cache的name --> <property name="authorizationCacheName" value="bos" /> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <!-- 开启shiro注解模式 --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor" > <property name="proxyTargetClass" value="true" /> </bean> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> </beans>
applicationContext-shiro.xml

例如:

@Override @CacheEvict(value = "standard", allEntries = true) public void save(Standard standard) { standardRepository.save(standard); } @Override @Cacheable(value = "standard", key = "#pageable.pageNumber+'_'+#pageable.pageSize") public Page<Standard> findPageData(Pageable pageable) { return standardRepository.findAll(pageable); }
StandardServiceImpl

 https://www.cnblogs.com/sdream/p/5966668.html

相关文章
相关标签/搜索