package com.easyooo.framework.sharding; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.Ordered; import com.easyooo.framework.sharding.annotation.Table; /** * * Sharding Context binding by aspect * * @author Killer */ @Aspect public class ShardingContextAspect implements Ordered{ Logger logger = LoggerFactory.getLogger(getClass()); private ShardingContextExecutor shardingContextExecutor; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Database Operation Pointcuts & Advice //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Pointcut("execution(* com.easyooo.show.data.persistence..*Mapper.*(..))") public void operationPointcut() { } @Around("operationPointcut()") public Object doOperation(final ProceedingJoinPoint pjp) throws Throwable{ Class<?> operationClass = pjp.getSignature().getDeclaringType(); Table table = operationClass.getAnnotation(Table.class); return shardingContextExecutor.doProxy(pjp.getArgs(), table, new ShardingCallback() { @Override public Object doCallback() throws Throwable { return pjp.proceed(); } }); } @Override public int getOrder() { return 0; } public void setShardingContextExecutor( ShardingContextExecutor shardingContextExecutor) { this.shardingContextExecutor = shardingContextExecutor; } }