簡體   English   中英

Spring Autowiring 不工作(依賴注入)

[英]Spring Autowiring not working (Dependency Injection)

編輯:我剛剛發現我的問題基本上就是這里解釋的內容。 所以我現在將首先嘗試使用我可以在那里找到的信息來讓它工作。

我正在用 Spring 框架做我的第一步,resp。 它的自動裝配功能。 我遵循了本教程,但似乎我錯過了一些東西。 我已成功將所有 spring jar 添加到我的項目中,並在我的 src 文件夾中定義了一個配置(“springbeans.xml”),如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config/>

    <bean id="myC" class="some.package.C"></bean>

</beans>

在我的應用程序的 main 方法中,我正在初始化配置:

new ClassPathXmlApplicationContext("springbeans.xml");

請注意,我只是創建了一個匿名引用來觸發初始化,但沒有將其存儲到任何變量中,因為我沒有嘗試通過context.getBean("myC")檢索我的實例context.getBean("myC")順便說一下! )。 但據我所知,只觸發一切的初始化就足夠了?

那么,我在我想要自動裝配的some.package包中有這個類“C”。 該類提供了一個沒有參數的公共構造函數。 沒有以任何方式注釋這個類,也許這就是問題所在。 但是我試圖將其注釋為@Service@Component ,但並沒有解決問題。 但說實話,我並沒有真正理解何時使用這些注釋以及它們的含義。

無論如何,然后我有一些其他類,我嘗試自動裝配我的 C 實例:

...
@Autowired
private C c;

以及該類中使用 c 變量的某些方法。 但是當該方法被執行時,我得到一個 NullPointerException,所以很明顯自動裝配不起作用。

我做錯了什么?

編輯:正如我向我解釋的那樣,我的問題是我使用自動裝配的類也必須是一個 bean 並且也由 spring 初始化。 但這里有一個問題:在我的例子中,這個類實際上是一個 JavaFX 控制器類。 我不實例化它,JavaFX 在內部進行。 這是否意味着我不能在那里使用自動裝配?

謝謝 :)

好的,所以我找到了一個如何將 Spring 與 JavaFX 控制器一起使用的解決方案。 關鍵是使用 spring 管理的加載器加載 FXML:

public class SpringFxmlLoader {

    private static final ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springbeans.xml");

    public static Parent load(String url) {
        try (InputStream fxmlStream = SpringFxmlLoader.class
                .getResourceAsStream(url)) {
            System.err.println(SpringFxmlLoader.class
                    .getResourceAsStream(url));
            FXMLLoader loader = new FXMLLoader();
            loader.setControllerFactory(clazz -> applicationContext.getBean(clazz));
            return loader.load(fxmlStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

現在,當我在 spring 配置中將我的控制器定義為 bean,並將我的自動裝配目標定義為 bean 時,我可以成功地在我的 FX 控制器類中自動裝配目標類。

@Autowired 私有 C myC; 您必須將對象重命名為您的 ID 名稱

當spring為你創建bean時,你需要告訴它你的bean id和實例引用名稱是否不同。

您想要實現的目標可以通過三種方式實現。

  1. 更改您的 xml 配置以將 bean id 與引用名稱匹配

bean id="c" class="some.package.C"

  1. 更改您的實例引用名稱以使其與 bean id @Autowired 相同

私人 C myC;

  1. 提供限定符以指示您的自動裝配

@Autowire @Qualifier("myC") private C c;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM