Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何执行某些服务只能从服务层调用_Java_Spring - Fatal编程技术网

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

Java 如何执行某些服务只能从服务层调用,java,spring,Java,Spring,我想要一些@Component bean,它应该只从@Service bean调用,而不从其他bean调用。我如何执行它?我不想改变maven的包装。要求运行事务怎么样?但这只是运行时检查,而不是编译时检查。添加一个方面来拦截服务方法调用 @Around("execution(* MyComponent)") public void wrapAround(ProceedingJoinPoint joinPoint) throws Throwable { joinPoint.procee

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

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

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

然后检查调用方类

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;
     }
}

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

Nice,但仍然只有运行时解决方案。可以为编译时检查做些什么吗?我怀疑是否有可能进行编译时检查。注释只是一个标记,可以进行间接调用。尽管有点复杂,但有一种方法是创建一些编译器注释处理器。也许我必须等待Java9模块的支持。
for (Annotation annotation : Caller.class.getAnnotations()) {