2012-07-20 89 views
2

我有以下的情況後:谷歌吉斯,怎麼之前注入資源,並注入類

類ServiceCaller:

public class ServiceCaller{ 
    private Service service; 
    public void initialize(List<String> params){ 
     //get the params from list and set to String objects 
     service = new Service(param1,param2); 
    } 
} 

一流的服務:

public class Service{ 
    SomeClass classe; 
    public Service(String param1,String param2){ 
     //call methods to do stuffs with params 
     classe = new SomeClass(); 
    } 
} 

我的申請一個讀取.properties並調用ServiceCaller Class並在構造完成後初始化並填充ServiceCaller中的參數的框架。 Service類只是簡單地使用參數,而實例則是SomeClass類。

我想這一切傳遞給谷歌吉斯,和我的課是如此:

服務等級來電:

public class ServiceCaller{ 
    private final Service service; 

    @Inject 
    public ServiceCaller(Service service){ 
     this.service = service; 
    } 
    public initialize(List<String> params){ 
     //set params to objects... 
    } 
} 

和一流的服務:

public class Service{ 
    private final SomeClass classe; 

    @Inject 
    public Service(SomeClass classe, String param1,String param2){ 
     //call methods to do stuffs with params 
     this.classe = classe; 
    } 
} 

這裏的我的疑問:我能做到這一點?

1 - 在ServiceCaller中,注入的構造函數在initMethod之前調用,這樣他就沒有參數了。我認爲這會在Service類中生成一個nullPointer。我怎樣才能收到字符串參數?

2 - 如何注入ServiceCaller類中的服務類?他需要調用init,使用參數來裝載Service類,並且只有在這一刻纔將Service(帶有參數)注入到ServiceCaller中。

+1

誰定義了「params」?它真的是一個運行時調用,還是這些會話/應用程序範圍的值(如wsdl-url,jndi-name,...)?然後你可以通過模塊配置這些值並將它們注入爲「Named」常量...... – 2012-07-21 07:41:55

回答

1

難道是ServiceCaller的工作配置Service?如果是這樣,那麼這種情況並不適合依賴注入。就像現在一樣,只需創建Servicenew即可。

但有可能它不是真的ServiceCaller的工作來創建Service。而應將參數直接注入Service進行配置,然後將組態的Service注入ServiceCaller

現在,如果問題是參數來自ServiceCaller,但需要SomeClass被注入,則既不ServiceCaller也不吉斯將能夠做自己的工作。我建議你拆分結構:創建一個ServiceFactory,它可以用SomeClass注入,然後注入ServiceCaller,然後提供一個工廠方法,它接受參數。例如:

ServiceCaller { 
    private final ServiceFactory serviceFactory; 
    private Service service; 

    @Inject 
    public ServiceCaller(ServiceFactory serviceFactory) { 
     this.serviceFactory = serviceFactory; 
    } 

    public void initialize(List<String> params) { 
     service = serviceFactory.create(params.get(0), params.get(1)); 
    } 
} 

class Service { 
    private final SomeClass classe; 

    public Service(SomeClass classe, String param1, String param2) { 
     //call methods to do stuffs with params 
     this.classe = classe; 
    } 
} 

class ServiceFactory { 
    private final SomeClass classe; 

    @Inject 
    public ServiceFactory(SomeClass classe) { 
     this.classe = classe; 
    } 

    public Service create(String param1, String param2) { 
     return new Service(classe, param1, param2); 
    } 
} 
+0

它的確是ServiceCaller的工作創建服務,並且調用者在另一種情況下使用Service的實例。我instanciate它的財產(與新的服務()),但現在我不知道如何注入「SomeClass」裏面的服務。 – 2012-07-20 13:24:27

+1

我編輯過,以表明我該怎麼做。 – 2012-07-22 09:41:50

+0

謝謝,這個解決方案解決了我的問題。 – 2012-07-23 19:42:32