通过ehcache以编程方式使用缓存:
跟上面的方式相同,但是缓存通过ehcache去管理,当然比使用map有N多种好处,比如缓存太大了快达到上限之后,将哪一部分缓存清除出去。这种方式完全是通过代码的方式使用ehcache缓存,虽然自由,却也很麻烦;有些比如单纯的场景下,不需要如此麻烦,直接通过注解就行了。
以前在Spring项目中要通过注解的方式使用缓存,比如借助一个jar包:ehcache-spring-annotations.jar,可以在googlecode上面下载,不过已经很久没有更新过了。
 
 
 <?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd
http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd"> <context:component-scan
base-package="com.mpr.mprsp.mcrc.service.mcrs.precedencecode" />
<!-- ehcache config Start -->
<ehcache:annotation-driven />
<ehcache:config cache-manager="cacheManager">
<ehcache:evict-expired-elements
interval="60" />
</ehcache:config>
<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="osgibundlejar:/META-INF/ehcache/ehcache.xml" />
</bean>
<!-- ehcache config End --> <tx:annotation-driven transaction-manager="txManager" /> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory" />
</bean> <!-- 定时任务开始 -->
<!-- 线程执行器配置,用于任务注册 -->
<bean id="executor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="500" />
</bean> <!-- 业务对象 -->
<bean id="timerTask"
class="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.internal.TimerTask" /> <!-- 调度业务 update by wangtao 20130715 -->
<bean id="jobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="timerTask" />
<property name="targetMethod" value="serviceTimerTask" />
</bean> <!-- 测试 -->
<bean id="taskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<!-- 延迟10秒启动 -->
<property name="startDelay" value="10000" />
<!-- 每隔20秒执行一次 -->
<property name="repeatInterval" value="20000" />
</bean> <!-- 增加调度触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<!-- 每天晚上11点触发 -->
<property name="cronExpression" value="0 0 23 * * ?" />
</bean> <!-- 增加调度触发器 add by wangtao 20130715 -->
<bean id="autoApplyCodeCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<!-- 每天中午12点触发 -->
<property name="cronExpression" value="0 0 12 * * ?" />
</bean> <!-- 设置调度 update by wangtao 20130715 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- <ref bean="cronTrigger" /> -->
<ref bean="cronTrigger" />
</list>
</property>
<property name="taskExecutor" ref="executor" />
</bean>
<!-- 定时任务结束 --> <!-- 引入服务 -->
<!-- 引入文件服务器同步 -->
<osgi:reference id="fileSyncManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.upload.service.IFileSyncManager" />
<!-- 引入系统配置项 -->
<osgi:reference id="sysConfigManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.configuration.service.ISysConfigManager" />
<!-- 引入邮件管理 -->
<osgi:reference id="mailSendManager"
interface="com.mpr.mprsp.mcrc.email.service.IMailSendManager" />
<!-- 引入SqlSessionFactory -->
<osgi:reference id="sqlSessionFactory"
interface="org.apache.ibatis.session.SqlSessionFactory" bean-name="sqlSessionFactory" />
<!-- 引入DataSourceTransactionManager -->
<osgi:reference id="txManager"
interface="org.springframework.jdbc.datasource.DataSourceTransactionManager"
bean-name="txManager" />
<!-- 引入ParametersMapBuilder -->
<osgi:reference id="parametersMapBuilder"
interface="com.isoftstone.agiledev.core.query.mybatis.ParametersMapBuilder"
bean-name="parametersMapBuilder" /> <!-- 暴露服务 -->
<!-- 暴露MPR出版物内容类型 -->
<osgi:service ref="publicationContentTypeManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IPublicationContentTypeManager" />
<!-- 暴露语种管理 -->
<osgi:service ref="languageManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.ILanguageManager" />
<!-- 暴露码段管理 -->
<osgi:service ref="mprCodeSegmentManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IMprCodeSegmentManager" />
<!-- 暴露预警阀值 -->
<osgi:service ref="mprCodeThresholdManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IMprCodeThresholdManager" />
<!-- 暴露MPR前置码生效信息管理 -->
<osgi:service ref="caroperInfoSyncManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.ICaroperInfoSyncManager" />
<!-- 暴露MPR前置码文件管理 -->
<osgi:service ref="mprFileManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IMprFileManager" />
<!-- 暴露撤销记录管理 -->
<osgi:service ref="revocationStatsManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IRevocationStatsManager" />
<!-- 暴露废除记录管理 -->
<osgi:service ref="abolishStatsManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IAbolishStatsManager" />
<!-- 暴露图书业务管理 -->
<osgi:service ref="publicationManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IPublicationManager" />
<!-- 暴露 期刊业务管理 -->
<osgi:service ref="periodicalManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IPeriodicalManager" />
<!-- 暴露报纸业务管理 -->
<osgi:service ref="newsPaperManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.INewsPaperManager" />
<!-- 暴露音像业务管理 -->
<osgi:service ref="audioManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IAudioManager" />
<!-- 暴露(组区)MPR出版物管理 -->
<osgi:service ref="publicationAreaManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IPublicationAreaManager" />
<!-- MPR出版物视图服务类 -->
<osgi:service ref="publicationViewManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IPublicationViewManager" />
<!-- MPR 资源类 -->
<osgi:service ref="mprCodeResourceManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IMprCodeResourceManager" />
<!-- 关联关系管理 -->
<osgi:service ref="isliMprCodeRelationManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IIsliMprCodeRelationManager" /> <!-- option 下拉选框数据 -->
<osgi:service ref="optionManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IOptionManager" /> <osgi:service ref="apiPublicationService"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IApiPublicationService" /> <!-- openservice 暴露前置编码服务接口 -->
<osgi:service ref="openService"
interface="com.mpr.mprsp.mcrc.service.mcrs.precedencecode.service.IOpenService" /> <osgi:reference id="sysLogManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.system.service.ISysLogManager"/> <osgi:reference id="statsMprManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.statistics.service.IStatsMpr" />
<osgi:reference id="statsPublication"
interface="com.mpr.mprsp.mcrc.service.mcrs.statistics.service.IStatsPublication" />
<osgi:reference id="statsPublisher"
interface="com.mpr.mprsp.mcrc.service.mcrs.statistics.service.IStatsPublisher" />
<osgi:reference id="publisherGroupManager"
interface="com.mpr.mprsp.mcrc.service.mcrs.publisher.service.IPublisherGroupManager" />
</beans>
共有两个注解:
  • @Cacheabele      :指定方法使用缓存
  • @TriggersRemove  :从缓存中移除对象
在查询的方法上使用缓存:
    @SuppressWarnings("unchecked")
@Cacheable(cacheName = "publicationsCache")
public List<PublicationViewInfo> query(PublicationViewInfoParams params)
throws Exception
 
在删除或更新的方法上清空缓存:
@Override
@TriggersRemove(cacheName = {"publicationsCache"},
when = When.AFTER_METHOD_INVOCATION,
removeAll = true)
public int hiddenResource(Long resourceId, String publicationType,
Boolean isHidden) throws Exception {

ehcache注解全面解析的更多相关文章

  1. ehcache注解全面解析---打酱油的日子

    通过ehcache以编程方式使用缓存: 跟上面的方式相同,但是缓存通过ehcache去管理,当然比使用map有N多种好处,比如缓存太大了快达到上限之后,将哪一部分缓存清除出去.这种方式完全是通过代码的 ...

  2. Java注解全面解析(转)

    1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...

  3. Spring源码情操陶冶-AnnotationConfigBeanDefinitionParser注解配置解析器

    本文承接前文Spring源码情操陶冶-自定义节点的解析,分析spring中的context:annotation-config节点如何被解析 源码概览 对BeanDefinitionParser接口的 ...

  4. Spring的AOP配置文件和注解实例解析

    1.1           Spring的AOP配置文件和注解实例解析 AOP它利用一种称为"横切"的技术,将那些与核心业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减 ...

  5. 【面试加分项】java自己定义注解之解析注解

    我之前的博客中说明过自己定义注解的声明今天我们来看看怎样对我们自己定义的注解进行使用. 1.我们在程序中使用我们的注解. 上一篇中我们自己定义了一个注解: @Target(ElementType.FI ...

  6. @Aspect 注解切面解析

    注解切面解析 注解切面解析器 /** * 注解切面解析器 */ public class BeanFactoryAspectJAdvisorsBuilder { /** * Bean 工厂 */ pr ...

  7. RequestMapping 注解的解析、匹配、注册

    RequestMapping 注解的解析.匹配.注册 1)创建 RequestMappingHandlerMapping 实例时会触发 afterPropertiesSet 调用. 2)读取容器中所有 ...

  8. springmvc 自定义注解 以及自定义注解的解析

    1,自定义注解名字 @Target({ElementType.TYPE, ElementType.METHOD})   //类名或方法上@Retention(RetentionPolicy.RUNTI ...

  9. spring启动component-scan类扫描加载,以及@Resource,postConstruct等等注解的解析生效源码

    spring里IOC的原理就不详细写了, 如果想要搞清楚自动扫描组件是如何实现的,还有@Resouce @PostConstruct等注解的工作原理,最好可以先搞清楚整个IOC容器的运作原理再来分析这 ...

随机推荐

  1. javascript脚本混淆

    javascript脚本混淆  脚本病毒是一个一直以来就存在,且长期活跃着的一种与PE病毒完全不同的一类病毒类型,其制作的门槛低.混淆加密方式的千变万化,容易传播.容易躲避检测,不为广大网民熟知等诸多 ...

  2. 爬取杭电oj所有题目

    杭电oj并没有反爬 所以直接爬就好了 直接贴源码(参数可改,循环次数可改,存储路径可改) import requests from bs4 import BeautifulSoup import ti ...

  3. html 动态生成

    function func_creatediv(item, index, input) { var ip = document.createElement("div"); ip.n ...

  4. Django教程(1)

    增加新的视图: 1. 在app/view.py下增加调用视图函数 def horizonG(request): return render(request, 'horizonG.html') 2. 在 ...

  5. Cadence Allegro小技巧之指定Gerber生成路径

    Allegro生成Gerber数据时,默认会保存在与pcb文件相同目录路径下,Gerber数据本身就会生成好几个文件,然后与pcb文件,log文件,临时文件等混杂在一起,不易整理打包Gerber数据, ...

  6. C语言-const和volatile深度分析

    1.const只读变量 const修饰的变量是只读的.本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局数据区分配空间 const只在编译期有用,在运行期无用 con ...

  7. 在 linux 中连接 mysql 数据库

    命令格式 mysql -h主机地址 -u用户名 -p用户密码 登录本机 mysql mysql -u用户名 -p用户密码 实例 TD - X1数据库:/opt/lampp/bin/mysql -u r ...

  8. linux安装Zookeeper及redis集群

    亲测有效: 1.linux下安装zookeeper:https://www.cnblogs.com/zuolun2017/p/8186254.html 2.linux下安装redis集群:https: ...

  9. 在多租户(容器)数据库中如何创建PDB:方法1 从种子创建PDB

    基于版本:19c (12.2.0.3) AskScuti 创建方法:从零开始创建一个PDB(从PDB$SEED创建新的PDB) 对应路径:Creating a PDB --> Creating ...

  10. Java+Selenium+Testng自动化测试学习(三)— 断言

    1.修改Login类加入断言: 断言:检查我们操作页面后得到的结果与我们预期的结果是否一致. 2.使用xml文件运行所有的测试类: Login类写入两个测试用例: package com.test; ...