我应该如何解决这种循环依赖

时间:2020-07-04 15:49:49

标签: java javafx dependency-injection circular-dependency afterburner.fx

I use a dependency injection framework called afterburner.fx btw.

Basically, I have View1, which contains a button to go to View2, so View1 depends on View2. 
But View2 has a back button, so it on View1. As a result, my programs output looks like this:

    Caused by: java.lang.StackOverflowError
    at java.base/java.lang.String.startsWith(String.java:1495)
    at java.base/java.net.URL.isBuiltinStreamHandler(URL.java:1675)
    at java.base/java.net.URL.isBuiltinStreamHandler(URL.java:1670)
    at java.base/java.net.URLStreamHandler.setURL(URLStreamHandler.java:523)
    at java.base/java.net.URLStreamHandler.parseURL(URLStreamHandler.java:321)
    at java.base/sun.net.www.protocol.file.Handler.parseURL(Handler.java:67)
    at java.base/java.net.URL.<init>(URL.java:701)
    at java.base/java.net.URL.<init>(URL.java:568)
    at java.base/jdk.internal.loader.URLClassPath$FileLoader.getResource(URLClassPath.java:1216)
    at java.base/jdk.internal.loader.URLClassPath$FileLoader.findResource(URLClassPath.java:1205)
    at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:294)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findResourceOnClassPath(BuiltinClassLoader.java:499)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findResource(BuiltinClassLoader.java:323)
    at java.base/java.lang.ClassLoader.getResource(ClassLoader.java:1401)
    at java.base/java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:1737)
    at java.base/java.lang.Class.getResourceAsStream(Class.java:2728)
    at com.airhacks.afterburner.configuration.Configurator.getProperties(Configurator.java:74)
    at com.airhacks.afterburner.configuration.Configurator.getProperty(Configurator.java:103)
loop:
    at com.airhacks.afterburner.injection.Injector.injectMembers(Injector.java:140)
    at com.airhacks.afterburner.injection.Injector.injectMembers(Injector.java:129)
    at com.airhacks.afterburner.injection.Injector.injectAndInitialize(Injector.java:122)
    at com.airhacks.afterburner.injection.Injector.instantiateModelOrService(Injector.java:111)
loop x 200

我该如何解决?我想到了编辑afterburner.fx的源代码以首先实例化寄存器类,然后注入它们的字段。

1 个答案:

答案 0 :(得分:0)

我制作了一个包含HashMap<Class<? extends View>,<View>>的类,并在View1中做了hashMap.put(this.getClass(), this),在View2中做了View1 view1 = hashMap.get(View1.class);