- 浏览: 468516 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (146)
- Maven (3)
- Quartz (10)
- Hessian (3)
- JDK (42)
- eclipse (4)
- 设计思想 (6)
- XML (8)
- JavaMail (1)
- Spring (11)
- mina (1)
- HsqlDb (1)
- Cache (2)
- Tool (6)
- 心情 (5)
- JQuery (0)
- Hadoop (5)
- Hbase (3)
- 自动构建 (7)
- JNDI (0)
- 代码赏析 (5)
- Oracle (1)
- Excel (4)
- Effective Java (5)
- JAXB (4)
- fdafasdf (1)
- ccc (0)
- web (3)
- concurrent (1)
- CVS (1)
- eclipse plugin (2)
- Apache (10)
最新评论
-
chxiaowu:
nice!
Quartz实现固定执行次数 -
zxjlwt:
学习了。http://surenpi.com
自定义ClassLoader -
kadlly:
public static final Logger log ...
Hessian 权限认证 -
spring_springmvc:
java程序语言学习教程 地址http://www.zuida ...
Java-Final -
liushuiwuyan:
[img][/img]
设计模式-单例
设计:
1. 定义一个接口
2. 定义一个实现类
3. 定义一个Annotation
4. 定义一个Annotation解析器
5. 定义一个Proxy
6. 定义一个proxy来代理接口实现。
代码如下:
实现类
Annotation类
Annotation解析类
代理类
代理接口实现类
配置如下:
测试代码如下:
可以看到配置了Ehcache的方法实现了缓存功能。
1. 定义一个接口
2. 定义一个实现类
3. 定义一个Annotation
4. 定义一个Annotation解析器
5. 定义一个Proxy
6. 定义一个proxy来代理接口实现。
代码如下:
package org.frame.base.annotation.intercept; public interface TestI { public int add(int a,int b); public int xx(int a); }
实现类
public class Test implements TestI{ public int add(int a,int b){ return a+b; } @EhCache(key="cacheKey") public int xx(int a){ return a; } }
Annotation类
package org.frame.base.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Annotation indicating that a method (or all the methods on a class) can be cached. * * <p>The method arguments and signature are used for computing the key while the * returned instance is used as the cache value. * * @author xxx * @since 1.0 */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface EhCache { /** * Name of the caches in which the update takes place. * <p>May be used to determine the target cache (or caches), matching the * qualifier value (or the bean name(s)) of (a) specific bean definition. */ String[] value() default ""; /** * Spring Expression Language (SpEL) attribute for computing the key dynamically. * <p>Default is "", meaning all method parameters are considered as a key. */ String key() default ""; /** * Spring Expression Language (SpEL) attribute used for conditioning the method caching. * <p>Default is "", meaning the method is always cached. */ String condition() default ""; }
Annotation解析类
package org.frame.base.annotation; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; import org.springframework.util.Assert; /** * EhCache的操作对象 * * */ public class EhCacheOperator { private String name; private Set<String> cacheNames = Collections.emptySet();//value private String key = "";//key private String condition = "";//condition public Set<String> getCacheNames() { return cacheNames; } public void setCacheNames(String[] cacheNames) { Assert.notEmpty(cacheNames); this.cacheNames = new LinkedHashSet<String>(cacheNames.length); for (String string : cacheNames) { this.cacheNames.add(string); } } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getCondition() { return condition; } public void setCondition(String condition) { this.condition = condition; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
代理类
package org.frame.base.annotation.intercept; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Collection; import org.frame.base.annotation.CachePaserImpl; import org.frame.base.annotation.EhCacheOperator; import org.frame.base.annotation.support.EhCacheAnnotationParser; import org.frame.base.cache.LocalCacheManager; /** * 在代理层使用缓存 * */ public class ProxyHandler implements InvocationHandler { EhCacheAnnotationParser ehcacheParser = new EhCacheAnnotationParser(); LocalCacheManager cacheManager = LocalCacheManager.getInstance(); private Object target; public void setTarget(Object o){ this.target = o; } public ProxyHandler(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; Collection<EhCacheOperator> ehcacheOperators = ehcacheParser.getCacheOperations(method, target.getClass()); if(ehcacheOperators == null || ehcacheOperators.isEmpty()){ result = method.invoke(target, args); }else{ for(EhCacheOperator ehcacheOperator:ehcacheOperators ){ if(ehcacheOperator.getName().equals(CachePaserImpl.EHCACHE)){//ehcache 注解 Object cacheObj = cacheManager.get(ehcacheOperator.getKey()); if(cacheObj == null){ result = method.invoke(target, args); if(result != null){ cacheManager.put(ehcacheOperator.getKey(), result); } }else{ result = cacheObj; } } } } return result; } }
代理接口实现类
package org.frame.base.annotation.support; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import org.frame.base.annotation.intercept.ProxyHandler; import org.springframework.beans.factory.FactoryBean; /** * 代理某个对象的所有接口 * */ public class EhCacheFactoryBean implements FactoryBean{ private Object target; private Object proxyObj = null; private Class<?>[] interfaceClass = null; public void setTarget(Object target){ this.target = target; } /** * 接口反映返回对象 * 1. serviceInterface 接口 * 2. target 目标地址,IP:端口 * @throws Exception */ public void init() throws Exception { interfaceClass = target.getClass().getInterfaces(); InvocationHandler handler = new ProxyHandler(target); proxyObj = Proxy.newProxyInstance(target.getClass().getClassLoader(), interfaceClass, handler); } @Override public Object getObject() throws Exception { return proxyObj; } @SuppressWarnings("unchecked") @Override public Class getObjectType() { return interfaceClass[0]; } @Override public boolean isSingleton() { return true; } }
配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans default-autowire="byName"> <!-- annotation intercept--> <bean id="testIano" class="org.frame.base.annotation.support.EhCacheFactoryBean" init-method="init"> <property name="target"> <ref bean = "testI"/> </property> </bean> <!-- 原始结构 --> <bean id="testI" class ="org.frame.base.annotation.intercept.Test"/> </beans>
测试代码如下:
ApplicationContext cxt = new ClassPathXmlApplicationContext(new String[]{"annotation/ano.xml"}); //TestI testI = (TestI) cxt.getBean("testI"); TestI testI = (TestI) cxt.getBean("testIano"); int a = 10; int b = 11; System.out.println(testI.add(a, b)); System.out.println(testI.add(a, b)); System.out.println(testI.xx(a)); System.out.println(testI.xx(a));
可以看到配置了Ehcache的方法实现了缓存功能。
评论
2 楼
a123159521
2014-04-10
ehcacheOperators
应该是忘记上传了, 这个类是解析类,从名字就看的出来。
至尊宝_唯一 写道
EhCacheAnnotationParser ehcacheParser = new EhCacheAnnotationParser();
这个Parser类是哪儿来的啊?
这个Parser类是哪儿来的啊?
应该是忘记上传了, 这个类是解析类,从名字就看的出来。
1 楼
至尊宝_唯一
2014-04-08
EhCacheAnnotationParser ehcacheParser = new EhCacheAnnotationParser();
这个Parser类是哪儿来的啊?
这个Parser类是哪儿来的啊?
发表评论
-
Java Application Cache
2016-09-27 19:25 884Application Cache is used very ... -
Java 字符串分词
2015-01-02 14:43 1749在Java的世界里有个类型 ... -
jdk 1.6 新特性,集成Groovy, 性能很差
2014-04-02 14:27 1279性能都是相对的,如果调用量不是很大的话,可以忽略,毕竟使用为主 ... -
Fake Code easy implements
2014-04-01 15:41 1028package org.miniframe.modules ... -
JDK regex 用法及用途
2014-03-31 15:48 1215查找 Boolean flag = pattern.mat ... -
生产者消费者(四)
2014-03-04 12:32 1148需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者(三)
2014-03-04 10:59 961需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者(二)
2014-03-03 15:40 695需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者模式(一)
2014-02-28 14:30 1031需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
查看Class文件使用的JDK版本
2013-10-30 14:17 1116由于JDK一般是向下兼容的,所以有时候本地的JDK版本比类库的 ... -
Java源代码转码
2012-12-20 17:22 1324现在中国的项目很多,编码无非是UTF-8,GBK,GB2312 ... -
Tomcat集成OSGI,并通过JNDI开放Web调用
2012-12-03 11:22 3136Tomcat集成OSGi,首先要选择OSGI服务器,我这里采用 ... -
JDK的Logging
2012-11-07 15:49 1685jdk自带有一个log日志,对于一般的使用,仅够了. 代码如下 ... -
java.util.*
2012-11-06 14:23 1378java.util 工具包,灰常的有用,有机会一定要研读源码。 ... -
java.util.concurrent.*
2012-11-02 10:38 17781. java.util.concurrent.ArrayBl ... -
java.util.rt.*
2012-10-31 13:51 11141. java.util.HashMap 散列表,主要是以离散 ... -
巧秒设计方法,不返回null
2016-09-27 19:32 723/** * {@inheritDoc} * ... -
java doc 代码文档
2012-07-13 13:58 1330对于代码规范不解释了,网上很多。 在编写代码的时候,有一点灰 ... -
接口与抽象类
2012-07-11 16:53 11241. 接口设计必谨慎,除非业务变更,否则打死不能动接口。[不变 ... -
JVM优化机制好诡异
2012-04-20 08:43 1467long i[] = new long[1000000]; ...
相关推荐
本篇文章将详细探讨如何在Spring框架中集成并实现基于方法的缓存机制,利用Ehcache来优化数据访问。 首先,我们需要理解Spring的AOP概念,AOP允许我们定义横切关注点,如日志、事务管理或,正如在这个案例中,缓存...
在Spring Boot应用中,自定义注解来实现缓存机制是一种常见的优化手段,尤其是在处理大量重复数据查询时,可以显著提升应用性能。本教程将详细解释如何利用Spring Boot结合Redis来实现这一功能。 首先,我们需要...
现在使用的缓存技术很多,比如Redis、 Memcache 、 EhCache等,甚至还有使用ConcurrentHashMap 或 HashTable 来实现缓存。但在缓存的使用上,每个人都有自己的实现方式,大部分是直接与业务代码绑定,随着业务...
是的第一步 重点:所有项目都有sql文件,比其他博主项目要严谨一万倍所有项目本人亲自测试可运行使用!!有任何问题私我解决! 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,...
总结,AutoLoadCache是一个强大的缓存管理解决方案,通过AOP和注解实现了缓存与业务逻辑的解耦,同时提供了异步刷新和“拿来主义机制”来提升高并发环境下的性能。它为Java开发者提供了一种简单、高效的方式来管理和...
在本文中,我们将深入探讨如何使用SpringBoot、MyBatis和Ehcache来实现缓存数据。Ehcache是一款高效且易于使用的Java内存缓存框架,对于提升应用程序性能,尤其是在处理大量数据时,能起到显著作用。虽然在分布式...
本文将深入探讨如何结合Spring AOP与EhCache实现一个简单的缓存实例,以便优化Java应用的运行效率。 首先,让我们了解Spring AOP。Spring AOP是Spring框架的一部分,它允许我们在不修改业务代码的情况下,通过定义...
《Hibernate Annotation 中文文档》是Java开发者们的重要参考资料,它详细介绍了如何在Hibernate框架中使用注解进行对象关系映射(ORM)。Hibernate是一款强大的开源Java持久化框架,它简化了数据库与Java对象之间的...
Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 ...
Spring Boot+Redis+拦截器+自定义Annotation实现接口自动幂等 在实际的开发项目中,一个对外裸露的接口往往会濒临无数次哀求,我们来说明一下幂等的概念:随意多次执行所产生的影响均与一次执行的影响相同。根据这...
**正文** 标题“Hibernate ...在实际项目中,这些工具可以帮助实现高效、便捷的数据库操作,降低了与数据库交互的复杂性。了解和熟练掌握Hibernate的使用,对于任何Java后端开发人员来说都是至关重要的技能。
在本项目中,这些框架的集成使用了注解(Annotation)来简化配置,使得代码更加简洁和易于维护。 Struts1.3 是一个基于 Model-View-Controller (MVC) 模式的开源框架,用于构建动态 Web 应用。它提供了一种结构化的...
二级缓存可以通过第三方插件如Ehcache实现,可跨Session共享数据。 8. **配置文件**: 虽然本资源是基于Annotation的,但通常还需要一个hibernate.cfg.xml配置文件,用于设置数据库连接信息、方言、缓存策略等。在...
JCache提供了一套API,允许开发者在不依赖具体实现的情况下使用缓存。通过实现JCache接口,可以选择各种缓存提供商,如Hazelcast或Infinispan。以下是一个简单的JCache使用示例: ```java import javax.cache....
**正文** 《Hibernate Annotation API...通过合理运用注解,开发者能够高效地管理数据层,实现面向对象编程和关系型数据库之间的无缝对接。在实际开发中,理解并熟练掌握这些注解,能够提升开发效率,降低维护成本。
Spring3注解与Ehcache整合是现代Java应用中实现高效缓存管理的重要技术组合。在Spring框架中,注解提供了简洁的编程模型,而Ehcache则是一个广泛使用的开源缓存解决方案,它能有效提高应用程序性能,减少数据库访问...
使用`<cache:annotation-driven/>`元素开启基于注解的缓存控制,并通过`<bean>`标签配置EhCache的`CacheManager`。 4. **实体类和DAO层的缓存配置**:在Hibernate的实体类上,可以使用`@Cacheable`、`@CacheEvict`...
现在使用的缓存技术很多,例如Redis , Memcache , EhCache等,甚至还有使用ConcurrentHashMap或HashTable来实现缓存。但在缓存的使用上,每个人都有自己的实现方式,大部分是直接与业务代码绑定定,通过业务的变化...
本实例将介绍如何利用Spring AOP来实现自定义缓存功能。 首先,理解Spring AOP的基本概念。AOP是一种编程范式,它允许我们在不修改代码的情况下,为程序添加额外的功能,如日志记录、事务管理、安全检查等。在...