All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yuweix.kuafu.sharding.utils.ShardAopUtil Maven / Gradle / Ivy

The newest version!
package com.yuweix.kuafu.sharding.utils;


import com.yuweix.kuafu.sharding.Shardable;
import com.yuweix.kuafu.sharding.annotation.Shard;
import com.yuweix.kuafu.sharding.annotation.Sharding;
import com.yuweix.kuafu.sharding.strategy.Strategy;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;


public abstract class ShardAopUtil {
    /**
     * 确定物理库。
     * 检查当前切入点方法的参数中是否有{@link Shard}注解,有则分库,无则将{@param logicDatabaseName}设为物理库
     */
    public static String determinePhysicalDatabase(ProceedingJoinPoint point, String logicDatabaseName) {
        /**
         * 当前切入点所在的类必须是{@link Shardable}的子类
         */
        Object target = point.getTarget();
        if (!(target instanceof Shardable)) {
            return logicDatabaseName;
        }

        Object argObj = getAnnotationArg(point, Shard.class);
        if (argObj == null) {
            return logicDatabaseName;
        }
        Object shardingVal = getAnnotationArgVal(argObj, Sharding.class);
        if (shardingVal == null) {
            return logicDatabaseName;
        }
        Class persistClz = ((Shardable) target).getPersistClz();
        String logicTableName = ShardingUtil.getTableName(persistClz);
        Strategy strategy = ShardingUtil.getShardingStrategy(persistClz);
        if (strategy == null) {
            return logicDatabaseName;
        }
        return strategy.getPhysicalDatabaseName(logicDatabaseName, logicTableName, shardingVal);
    }

    public static Object getAnnotationArgShardVal(ProceedingJoinPoint point) {
        Object argObj = getAnnotationArg(point, Shard.class);
        if (argObj == null) {
            return null;
        }
        return getAnnotationArgVal(argObj, Sharding.class);
    }

    /**
     * 获取含有指定注解的参数对象
     */
    public static Object getAnnotationArg(ProceedingJoinPoint point, Class clz) {
        Method method = ((MethodSignature) point.getSignature()).getMethod();
        Parameter[] params = method.getParameters();
        if (params == null || params.length <= 0) {
            return null;
        }
        int idx = -1;
        for (int i = 0, len = params.length; i < len; i++) {
            if (params[i].isAnnotationPresent(clz)) {
                idx = i;
                break;
            }
        }
        if (idx < 0) {
            return null;
        }
        return point.getArgs()[idx];
    }

    /**
     * 检查入参对象所属类型中含有指定注解的属性,有则返回该属性的值,如果没有则返回入参本身的值。
     */
    public static Object getAnnotationArgVal(Object obj, Class clz) {
        if (obj == null) {
            return null;
        }
        Field[] fields = obj.getClass().getDeclaredFields();
        if (fields.length <= 0) {
            return obj;
        }
        for (Field field: fields) {
            if (field.isAnnotationPresent(clz)) {
                try {
                    field.setAccessible(true);
                    return field.get(obj);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return obj;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy