如何强制执行某些服务只能从服务层调用

时间:2017-06-27 12:02:26

标签: java spring

我想要一些@Component bean,只能从@Service bean调用,而不能从其他bean调用。我该如何执行呢?我不想改变maven包装。那要求运行交易怎么样?但它只是运行时而不是编译时检查。

1 个答案:

答案 0 :(得分:1)

添加一个方面来拦截服务方法调用。

@Around("execution(* MyComponent)")
public void wrapAround(ProceedingJoinPoint joinPoint) throws Throwable 
{
    joinPoint.proceed(); 
}

查看更多here

然后检查来电者类

public class KDebug {
    public static String getCallerClassName() { 
        StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
        for (int i=1; i<stElements.length; i++) {
            StackTraceElement ste = stElements[i];
            if (!ste.getClassName().equals(KDebug.class.getName()) && ste.getClassName().indexOf("java.lang.Thread")!=0) {
                return ste.getClassName();
            }
        }
        return null;
     }
}

来自here

检查调用者类是否有注释

for (Annotation annotation : Caller.class.getAnnotations()) {

并查找调用者是否有@Service注释。如果没有抛出异常