通过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. 虚拟机中CentOS 6.5 添加扩展分区

    此扩展方法要求支持LVM 1.更改虚拟机配置 虚拟机->设置->硬盘->扩展磁盘容量 fdisk -l 查看,发现硬盘空间变大了 [root@thj Desktop]# fdisk ...

  2. 16day 路径信息系列

    ../ 上一级目录 ./ 当前路径 ~ 返回到家目录 - 两个目录之间进行快速切换 An argument of - is equivalent to $OLDPWD(环境变量) 补充说明: [roo ...

  3. hashlib加密模块_python

    一.hashlib模块 1.功能 主要用于字符串加密 2.常用方法 md5()/sha1():创建一个md5或者sha1加密模式的hash对象update(arg):用字符串参数来更新hash对象,如 ...

  4. LitElement(六)生命周期

    1.概述 基于LitElement的组件通过响应观察到的属性更改而异步更新. 属性更改是分批进行的,如果在请求更新后,更新开始之前,发生更多属性更改,则所有更改都将捕获在同一次更新中. 在较高级别上, ...

  5. codeforces 1282C. Petya and Exam (贪心)

    链接:https://codeforces.com/contest/1282/problem/C 题意:  有一个人参加考试,考试只有两种题,一种是简单题,每道题耗时固定为a:另一种是困难题,每道题耗 ...

  6. 剑指offer 面试题52. 两个链表的第一个公共节点

    这题之前leetcode做过,权当复习 首先这题没说是否一定有公共节点,如果代码可能因为这一点造成死循环的,需要提前验证所给两个链表是否有公共节点. 方法1:对于每一个list1的节点,遍历list2 ...

  7. Oracle 11g安装 —— Oracle Database 11g Release2 for Windows(x64)

    文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104422421 下面是我的Oracle 11g安装过程,希望可以帮到正 ...

  8. 如何修改C# winform程序图标

    以Visual Studio 2012 C# Winform程序为例 一.程序内部显示图标的修改方法 在窗体的属性窗口找到icon属性,设置成已经准备好的ico格式的文件,效果如下 二.程序外部显示图 ...

  9. Virtual Judge POJ 3278 Catch That Cow

    #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...

  10. Flink读写Kafka

    Flink 读写Kafka 在Flink中,我们分别用Source Connectors代表连接数据源的连接器,用Sink Connector代表连接数据输出的连接器.下面我们介绍一下Flink中用于 ...