2012-09-06 38 views
2

是否可以向內部類注入Bean?向內部類注入彈簧

例如:

@Named 
public class outer { 

    @Inject 
    private SomeClass inst; // Injected correctly 

    private static class inner { 
     @Inject 
     private AnotherClass instance; // Not being injected 
... 

編輯:「AnotherClass」僅由內部類使用,所以我不想污染外類吧。將聲明保留在內部類中的另一個原因是,如果將AnotherClass成員移到外部類,我必須從內部類中除去靜態修飾符,或者將其添加到外部類成員中。

+0

我有點好奇,那我們爲什麼要需要注入內部類? –

+0

你爲什麼不調用外部類的方法來獲得「inst」? –

+5

也許他只是好奇它是否工作,personaly我不認爲它會,因爲靜態內部類加載和由JVM創建導致春天不監督其創建,因此DI不會工作。如我錯了請糾正我。 –

回答

4

@Inject這樣的註釋僅在Spring實例化對象時才使用。由於你用@Named註釋了外部,所以spring將會從中取出一個bean並正確注入SomeClass實例。另一方面,inner很可能是由你手動實例化的,所以Spring沒有辦法注意到這個註釋並且做了一些處理。

這不是關於內部還是頂層的類,它與誰創建對象有關。

0

從JVM的角度來看,靜態內部類與頂層類沒有什麼不同,因此可以將靜態內部類聲明爲Spring bean(例如,通過使用@Named對其進行註釋)。

很顯然,你需要從春天獲得該類的實例,如果你想使注射工作:

@Named 
public class Outer { 
    @Inject 
    private Provider<Inner> innerFactory; 

    public void foo() { 
     Inner inner = innerFactory.get(); // Injected correctly 
     ... 
    } 

    @Named 
    private static class Inner { 
     @Inject 
     private AnotherClass instance; 
    } 
}