2013-07-31 91 views
0

有兩個類,FooBar,在我的Seam 2.2.2供電應用程序中實現了一些接口Baz。我試圖建立一個Baz類型的組件,這些組件有條件地使用這兩個類中的一個來實現。爲了這個目的,我創建了一個工廠組件,BazFactory,實例化Baz與根據implClassName字段的值FooBar工廠實例化組件中的依賴注入

public interface Baz {...} 

public class Foo implements Baz { 

    @In 
    String injectedValue1; 

    ... 
} 

public class Bar implements Baz { 

    @In 
    String injectedValue2; 

    ... 
} 

@Name("bazFactory") 
@Scope(value = ScopeType.SESSION) 
public class BazFactory { 

    private String implClassName; 

    public void setImplClassName(String implClassName) { 
     this.implClassName = implClassName; 
    } 

    @Factory(value="baz", scope = ScopeType.SESSION) 
    public Baz getBazImpl() throws Exception { 
     Class.forName(this.implClassName).newInstance(); 
    } 
} 

的問題是,它的依賴不會注入實例化類在這種情況下。我設計的唯一解決方法是聲明FooBar的組件:

@Name("foo") 
@Scope(ScopeType.CONVERSATION) 
public class Foo implements Baz { 

    @In 
    String injectedValue1; 

    ... 
} 

@Name("bar") 
@Scope(ScopeType.CONVERSATION) 
public class Bar implements Baz { 

    @In 
    String injectedValue2; 

    ... 
} 

@Name("bazFactory") 
@Scope(value = ScopeType.SESSION) 
public class BazFactory { 

    private String implComponentName; 

    public void setImplComponentName(String implComponentName) { 
     this.implComponentName = implComponentName; 
    } 

    @Factory(value="baz", scope = ScopeType.SESSION) 
    public Baz getBazImpl() { 
     return (Baz) Component.getInstance(this.implComponentName); 
    } 
} 

然而,在這種情況下,有一個與範圍類型一團糟。例如,如何定義一個在其聲明中具有@Scope(ScopeType.CONVERSATION)的組件並在聲明實例化該組件的工廠方法(如上例中)時聲明scope = ScopeType.SESSION?此外,解決方法還包括爲每個Baz實施創建一個更多組件。因此,這種解決方法對我來說看起來很難看。如果有解決上述依賴注入問題的方法,我寧願使用第一種方法。

有沒有辦法將依賴注入工廠實例化的組件?

回答

0

您可以用更簡單的方法實現同樣的目的。 在您的工廠中,您不應該使用Class.forName()。newInstance()創建新實例。

在另一隻手放在上下文中的文件,你可以有豆子一樣

<bean id="bar" class="com.techidiocy.Bar"/> 
<bean id="foo" class="com.techidiocy.Foo"/> 

假設:的酒吧和Foo所需的屬性將被裝配或手動注射。

在您的工廠中,您可以使用該上下文文件並通過傳遞bean名稱來獲取該上下文文件,因爲您已在工廠中獲取該文件。

ApplicationContext context = new ClassPathXmlApplicationContext 
     ("classpath:context.xml"); 

return context.getBean(implClassName);//implClassName is the input that you are receiving in factory 

以這種方式,您可以返回所需的實現類型,取決於您在工廠類中接收到的輸入。

謝謝

+0

如果我沒有弄錯,這個解決方案是爲了Spring框架。我的問題被引用到Seam Framework 2.2.2,而不是Spring。 – vect

+0

哦對不起,我的壞意味着只有春天,我完全失去了它。 我會刪除我的答案。 - 感謝您指出。 – saurav

+0

無論如何,謝謝你的努力:) – vect