Java tutorial
/** * Copyright (c) 2009-2015 http://demi-panda.com * * Licensed */ package com.ace.erp.extra.aop; import com.ace.erp.common.cache.BaseCacheAspect; import com.ace.erp.entity.sys.User; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; /** * ? * * 1?username/email/mobilePhoneNumber------>id * 2?id------->Model * * Created with ace. * User: denghp * Date: 10/20/13 * Time: 10:16 PM */ @Component @Aspect public class UserCacheAspect extends BaseCacheAspect { public UserCacheAspect() { setCacheName("sys-userCache"); } private String idKeyPrefix = "id-"; private String usernameKeyPrefix = "username-"; private String emailKeyPrefix = "email-"; private String mobilePhoneNumberKeyPrefix = "mobilePhoneNumber-"; //////////////////////////////////////////////////////////////////////////////// //// //////////////////////////////////////////////////////////////////////////////// /** * ?Service */ @Pointcut(value = "target(com.ace.erp.service.sys.UserService)") private void userServicePointcut() { } /** * only put * ? ???? */ @Pointcut(value = "execution(* save(..)) " + "|| execution(* saveAndFlush(..)) " + "|| execution(* update(..)) " + "|| execution(* login(..)) " + "|| execution(* changePassword(..)) " + "|| execution(* changeStatus(..))") private void cachePutPointcut() { } /** * evict */ @Pointcut(value = "(execution(* delete(*))) && args(arg)", argNames = "arg") private void cacheEvictPointcut(Object arg) { } /** * put get * */ @Pointcut(value = "(execution(* getUserByName(*)) " + "|| execution(* findByEmail(*)) " + "|| execution(* findByMobilePhoneNumber(*)) " + "|| execution(* findOne(*)))") private void cacheablePointcut() { } //////////////////////////////////////////////////////////////////////////////// //// //////////////////////////////////////////////////////////////////////////////// @AfterReturning(value = "userServicePointcut() && cachePutPointcut()", returning = "user") public void cachePutAdvice(Object user) { //put cache put((User) user); } @After(value = "userServicePointcut() && cacheEvictPointcut(arg)", argNames = "arg") public void cacheEvictAdvice(Object arg) { if (arg == null) { return; } if (arg instanceof Long) { //only evict id evictId(String.valueOf(arg)); } if (arg instanceof Long[]) { for (Long id : (Long[]) arg) { //only evict id evictId(String.valueOf(id)); } } if (arg instanceof String) { //only evict id evictId((String) arg); } if (arg instanceof String[]) { for (String id : (String[]) arg) { //only evict id evictId(String.valueOf(id)); } } if (arg instanceof User) { //evict user evict((User) arg); } } @Around(value = "userServicePointcut() && cacheablePointcut()") public Object cacheableAdvice(ProceedingJoinPoint pjp) throws Throwable { String methodName = pjp.getSignature().getName(); Object arg = pjp.getArgs().length >= 1 ? pjp.getArgs()[0] : null; String key = ""; boolean isIdKey = false; if ("getUserById".equals(methodName)) { key = idKey(String.valueOf(arg)); isIdKey = true; } else if ("getUserByName".equals(methodName)) { key = usernameKey((String) arg); } else if ("getUserByEmail".equals(methodName)) { key = emailKey((String) arg); } else if ("getUserByMobilePhoneNumber".equals(methodName)) { key = mobilePhoneNumberKey((String) arg); } User user = null; if (isIdKey == true) { user = get(key); } else { Integer id = get(key); if (id != null) { key = idKey(String.valueOf(id)); user = get(key); } } //cache hit if (user != null) { log.debug("cacheName:{}, hit key:{}", cacheName, key); return user; } log.debug("cacheName:{}, miss key:{}", cacheName, key); //cache miss user = (User) pjp.proceed(); //put cache put(user); return user; } private String idKey(String id) { return idKeyPrefix + id; } private String usernameKey(String username) { return usernameKeyPrefix + username; } private String emailKey(String email) { return emailKeyPrefix + email; } private String mobilePhoneNumberKey(String mobilePhoneNumber) { return mobilePhoneNumberKeyPrefix + mobilePhoneNumber; } //////////////////////////////////////////////////////////////////////////////// ////cache //////////////////////////////////////////////////////////////////////////////// public void put(User user) { if (user == null) { return; } int id = user.getId(); //username email mobilePhoneNumber ---> id put(usernameKey(user.getUsername()), id); put(emailKey(user.getEmail()), id); put(mobilePhoneNumberKey(user.getMobilePhoneNumber()), id); // id ---> user put(idKey(String.valueOf(id)), user); } public void evictId(String id) { evict(idKey(id)); } public void evict(User user) { if (user == null) { return; } int id = user.getId(); evict(idKey(String.valueOf(id))); evict(usernameKey(user.getUsername())); evict(emailKey(user.getEmail())); evict(mobilePhoneNumberKey(user.getMobilePhoneNumber())); } }