栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

尝试通过Spring和扩展Hibernate的JpaRepository的自定义GenericDao接口使用EhCache

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

尝试通过Spring和扩展Hibernate的JpaRepository的自定义GenericDao接口使用EhCache

这是我最终采用的工作解决方案。精度很低:我的领域都实现了

Persistable
Spring
的接口。而且,由于我正在使用反射,因此我不确定缓存过程所节省的时间不会减少多少…

applicationContext.xml

<ehcache:annotation-driven cache-manager="ehCacheManager" default-cache-key-generator="daoCacheKeyGenerator" />    <bean id="ehCacheManager"  /><bean id="daoCacheKeyGenerator"  />

DaoCacheKeyGenerator.java(使用
gentyref
库)

public class DaoCacheKeyGenerator implements CacheKeyGenerator<DaoCacheKey> {    @SuppressWarnings("unchecked")    @Override    public DaoCacheKey generateKey(MethodInvocation methodInvocation) {        Method method = methodInvocation.getMethod();        Class<? extends GenericDao<?, ?>> daoType = (Class<? extends GenericDao<?, ?>>) methodInvocation.getThis().getClass().getInterfaces()[0];        Class<? extends Persistable<?>> domainType = getDomainType(daoType);        String methodName = method.getName();        Class<?>[] parameterTypes = method.getParameterTypes();        Object[] parameters = methodInvocation.getArguments();        return new DaoCacheKey(domainType, methodName, parameterTypes, parameters);    }    @SuppressWarnings("unchecked")    private Class<? extends Persistable<?>> getDomainType(Class<?> daoType) {        Type baseDaoType = GenericTypeReflector.getExactSuperType(daoType, GenericDao.class);        ParameterizedType parameterizedbaseDaoType = (ParameterizedType) baseDaoType;        return (Class<? extends Persistable<?>>) parameterizedbaseDaoType.getActualTypeArguments()[0];    }    @Override    public DaoCacheKey generateKey(Object... data) {        return null;    }}

DaoCacheKey.java

public class DaoCacheKey implements Serializable {    private static final long serialVersionUID = 338466521373614710L;    private Class<? extends Persistable<?>> domainType;    private String methodName;    private Class<?>[] parameterTypes;    private Object[] parameters;    public DaoCacheKey(Class<? extends Persistable<?>> domainType, String methodName, Class<?>[] parameterTypes, Object[] parameters) {        this.domainType = domainType;        this.methodName = methodName;        this.parameterTypes = parameterTypes;        this.parameters = parameters;    }    public Class<? extends Persistable<?>> getDomainType() {        return domainType;    }    @Override    public boolean equals(Object obj) {        return this == obj || obj instanceof DaoCacheKey && hashCode() == obj.hashCode();    }    @Override    public int hashCode() {        return Arrays.hashCode(new Object[] { domainType, methodName, Arrays.asList(parameterTypes), Arrays.asList(parameters) });    }}

ehcache.xml

<cache name="dao"    eternal="false"    maxElementsInMemory="10000"    overflowToDisk="false"    timeToIdleSeconds="86400"    timeToLiveSeconds="86400"    memoryStoreEvictionPolicy="LFU">    <cacheEventListenerFactory  /></cache>

DaoCacheEventListenerFactory.java

public class DaoCacheEventListenerFactory extends CacheEventListenerFactory {    @Override    public CacheEventListener createCacheEventListener(Properties properties) {        return new DaoCacheEventListener();    }}

DaoCacheEventListener.java

public class DaoCacheEventListener implements CacheEventListener {    @SuppressWarnings("unchecked")    @Override    public void notifyElementRemoved(Ehcache cache, Element element) throws CacheException {        DaoCacheKey daoCachekey = (DaoCacheKey) element.getKey();        List<Class<? extends Persistable<?>>> impacts = getoneToManyImpacts(daoCachekey.getDomainType());        for (DaoCacheKey daoCachedkey : (List<DaoCacheKey>) cache.getKeys()) { if (impacts.contains(daoCachedkey.getDomainType())) {     cache.remove(daoCachedkey); }        }    }    @SuppressWarnings("unchecked")    private List<Class<? extends Persistable<?>>> getoneToManyImpacts(Class<? extends Persistable<?>> domainType) {        List<Class<? extends Persistable<?>>> impacts = new ArrayList<Class<? extends Persistable<?>>>();        impacts.add(domainType);        for (Method method : domainType.getDeclaredMethods()) { if (method.isAnnotationPresent(OneToMany.class)) {     ParameterizedType parameterizedType = (ParameterizedType) method.getGenericReturnType();     Class<? extends Persistable<?>> impactedDomainType = (Class<? extends Persistable<?>>) parameterizedType.getActualTypeArguments()[0];     if (!impacts.contains(impactedDomainType)) {         impacts.addAll(getoneToManyImpacts(impactedDomainType));     } }        }        return impacts;    }    @Override    public void notifyElementPut(Ehcache cache, Element element) throws CacheException {    }    @Override    public void notifyElementUpdated(Ehcache cache, Element element) throws CacheException {    }    @Override    public void notifyElementExpired(Ehcache cache, Element element) {    }    @Override    public void notifyElementEvicted(Ehcache cache, Element element) {    }    @Override    public void notifyRemoveAll(Ehcache cache) {    }    @Override    public void dispose() {    }    @Override    public Object clone() throws CloneNotSupportedException {        return super.clone();    }}

希望能有所帮助

;)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/388142.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号