`

Annotation实现缓存

    博客分类:
  • JDK
 
阅读更多
设计:
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类是哪儿来的啊?


应该是忘记上传了, 这个类是解析类,从名字就看的出来。
1 楼 至尊宝_唯一 2014-04-08  
EhCacheAnnotationParser ehcacheParser = new EhCacheAnnotationParser();

这个Parser类是哪儿来的啊?

相关推荐

    Spring 与Ehcache实现基于方法的缓存

    本篇文章将详细探讨如何在Spring框架中集成并实现基于方法的缓存机制,利用Ehcache来优化数据访问。 首先,我们需要理解Spring的AOP概念,AOP允许我们定义横切关注点,如日志、事务管理或,正如在这个案例中,缓存...

    自定义注解实现缓存机制

    在Spring Boot应用中,自定义注解来实现缓存机制是一种常见的优化手段,尤其是在处理大量重复数据查询时,可以显著提升应用性能。本教程将详细解释如何利用Spring Boot结合Redis来实现这一功能。 首先,我们需要...

    高效的缓存管理解决方案AutoLoadCache.zip

    现在使用的缓存技术很多,比如Redis、 Memcache 、 EhCache等,甚至还有使用ConcurrentHashMap 或 HashTable 来实现缓存。但在缓存的使用上,每个人都有自己的实现方式,大部分是直接与业务代码绑定,随着业务...

    AutoLoadCache 是基于AOPAnnotation等技术实现的高效的缓存管理解决方案实现缓存与业务逻辑的解耦.zip

    是的第一步 重点:所有项目都有sql文件,比其他博主项目要严谨一万倍所有项目本人亲自测试可运行使用!!有任何问题私我解决! 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,...

    AutoLoadCache是基于AOPAnnotation等技术实现的高效的缓存管理解决方案

    总结,AutoLoadCache是一个强大的缓存管理解决方案,通过AOP和注解实现了缓存与业务逻辑的解耦,同时提供了异步刷新和“拿来主义机制”来提升高并发环境下的性能。它为Java开发者提供了一种简单、高效的方式来管理和...

    springboot+mybatis+ehcache实现缓存数据

    在本文中,我们将深入探讨如何使用SpringBoot、MyBatis和Ehcache来实现缓存数据。Ehcache是一款高效且易于使用的Java内存缓存框架,对于提升应用程序性能,尤其是在处理大量数据时,能起到显著作用。虽然在分布式...

    SpringAOP结合ehCache实现简单缓存实例

    本文将深入探讨如何结合Spring AOP与EhCache实现一个简单的缓存实例,以便优化Java应用的运行效率。 首先,让我们了解Spring AOP。Spring AOP是Spring框架的一部分,它允许我们在不修改业务代码的情况下,通过定义...

    hibernate annotation 中文文档

    《Hibernate Annotation 中文文档》是Java开发者们的重要参考资料,它详细介绍了如何在Hibernate框架中使用注解进行对象关系映射(ORM)。Hibernate是一款强大的开源Java持久化框架,它简化了数据库与Java对象之间的...

    springMVC二级缓存配置

    Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 ...

    Spring Boot+Redis+拦截器+自定义Annotation如何实现接口自动幂等.docx

    Spring Boot+Redis+拦截器+自定义Annotation实现接口自动幂等 在实际的开发项目中,一个对外裸露的接口往往会濒临无数次哀求,我们来说明一下幂等的概念:随意多次执行所产生的影响均与一次执行的影响相同。根据这...

    Hibernate distribution and annotation

    **正文** 标题“Hibernate ...在实际项目中,这些工具可以帮助实现高效、便捷的数据库操作,降低了与数据库交互的复杂性。了解和熟练掌握Hibernate的使用,对于任何Java后端开发人员来说都是至关重要的技能。

    struts1.3+spring2.5+hibernate3.3 组合开发 annotation实现

    在本项目中,这些框架的集成使用了注解(Annotation)来简化配置,使得代码更加简洁和易于维护。 Struts1.3 是一个基于 Model-View-Controller (MVC) 模式的开源框架,用于构建动态 Web 应用。它提供了一种结构化的...

    hibernate-annotation 所需要的jar包

    二级缓存可以通过第三方插件如Ehcache实现,可跨Session共享数据。 8. **配置文件**: 虽然本资源是基于Annotation的,但通常还需要一个hibernate.cfg.xml配置文件,用于设置数据库连接信息、方言、缓存策略等。在...

    分布式缓存与JavaEE

    JCache提供了一套API,允许开发者在不依赖具体实现的情况下使用缓存。通过实现JCache接口,可以选择各种缓存提供商,如Hazelcast或Infinispan。以下是一个简单的JCache使用示例: ```java import javax.cache....

    hibernate annotation api chm文件

    **正文** 《Hibernate Annotation API...通过合理运用注解,开发者能够高效地管理数据层,实现面向对象编程和关系型数据库之间的无缝对接。在实际开发中,理解并熟练掌握这些注解,能够提升开发效率,降低维护成本。

    spirng3注解(annotation)与ehcache的对象、页面缓存

    Spring3注解与Ehcache整合是现代Java应用中实现高效缓存管理的重要技术组合。在Spring框架中,注解提供了简洁的编程模型,而Ehcache则是一个广泛使用的开源缓存解决方案,它能有效提高应用程序性能,减少数据库访问...

    spring二级缓存

    使用`&lt;cache:annotation-driven/&gt;`元素开启基于注解的缓存控制,并通过`&lt;bean&gt;`标签配置EhCache的`CacheManager`。 4. **实体类和DAO层的缓存配置**:在Hibernate的实体类上,可以使用`@Cacheable`、`@CacheEvict`...

    AutoLoadCache:AutoLoadCache是​​基于AOP + Annotation等技术实现的高效的缓存管理解决方案,实现缓存与业务逻辑的解压缩,并增加异步刷新及“拿来主义机制”,以适应高并发环境下的使用

    现在使用的缓存技术很多,例如Redis , Memcache , EhCache等,甚至还有使用ConcurrentHashMap或HashTable来实现缓存。但在缓存的使用上,每个人都有自己的实现方式,大部分是直接与业务代码绑定定,通过业务的变化...

    spring aop 自定义缓存实现

    本实例将介绍如何利用Spring AOP来实现自定义缓存功能。 首先,理解Spring AOP的基本概念。AOP是一种编程范式,它允许我们在不修改代码的情况下,为程序添加额外的功能,如日志记录、事务管理、安全检查等。在...

Global site tag (gtag.js) - Google Analytics