2014-11-13 105 views
0

我有一個類,它具有一些我在構造函數中收到的動態屬性。 同一類別的其他屬性可以在春季注入。對象創建後注入屬性

我想知道這是否可能,我應該如何配置我的應用程序。我使用spring 3和xml配置。

下面是一個例子:

class MyClass { 
    private MyClass2 obj2; // should be injected by spring 
    private Long myId; 

    public MyClass(Long dynamicId) { 
     myId = dynamicId; 
    } 

    public void doSomehting() { 
     obj2.doOtherStuff(this); 
    } 
} 

所以,我想要什麼,因爲我必須動態地創建MyClass的是,我以後叫新MyClass的(1234),該OBJ 2被由Spring注入。

可能嗎?

回答

1

使用ObjectFactory從di容器中檢索bean。如果你把這個工廠包裝在你自己的工廠對象中,你可以設置任何屬性,並且仍然有由Spring管理的bean。既然你想讓bean有一些動態設置的屬性,可以通過你是否需要一個單一範圍的bean(默認)或者原型來進行思考。

如果您打算從XML配置做到這一點,你需要周圍的淤泥與objectfactorycreatingfactorybean。 Spring文檔非常好,只需按照示例進行操作即可。

如果做基於註解的配置,你只需要自動裝配的ObjectFactory的。請注意YourClass也必須聲明爲一個bean!

0

如果您使用new運算符動態創建MyClass實例,那麼該實例不在Spring的bean工廠中,因此Spring無法注入任何內容。從我所能看到的,你確實有兩種選擇。 1)讓MyClass成爲一個原型bean,這樣Spring在每次需要時都會給你一個新的實例。您需要將obj2定義爲要設置的屬性(或Autowired)。 2)通過Spring將obj2注入到創建MyClass實例的類中,並使obj2成爲構造函數參數,因此您必須注入它。

我從你的問題中讀到的0.02。需要注意的是,在Java中創建新實例時,它總是在Bean工廠之外,並且在Bean工廠之外執行的所有工作都會失去Spring代理行爲。在這裏要非常小心,你可以讓自己陷入一個難以追蹤的兔子洞。

1

我很確定這是不可能的。它看起來像你想要一個(可怕的音樂)工廠。

class MyClassFactory { 

    private final MyClass2 object; 

    public(MyClass2 object) { 
    this.object = object; 
    } 

    public createMyClass(Lond id) { 
    return new MyClass(id, object); 
    } 
}