2014-09-28 132 views
0

我是新來的春天,我有一個問題,我找不到答案 - 在方法執行過程中,我需要創建一個託管bean的新實例(範圍==原型)中的預定義數量:Spring在方法調用過程中獲得託管bean

@Component 
class SomeClass 
{ 
    @Resource 
    private ConnectionFactory conFactory; 

    private Set <Client> clients; 

    @Value ("${clientsNum}") 
    private int clientsNum; 

    public void init() 
    { 
     Client client = null; //an interface, that the managed bean implements. 

     for (int i = 0; i < clientsNum; i++) 
     { 
       client = ... //how to get a new client instance? 
       clients.add (client); 
       client.doSomething(); 
     } 
    } 

    public void shutdown() 
    { 
     for (Client client : clients) 
       client.shutdown(); 

     conFactory.shutdown(); 
    } 
} 

我該怎麼做?

我知道我可以使用init-method \ @PostConstruct註釋(和匹配的destroy方法),但我不知道如何根據所需的數量獲取實例。

我在過去幾天搜索了這個問題,並閱讀了關於服務定位器,查找方法和工廠bean的信息。它們都使用CGLIB(我不喜歡使用它)或Spring的ApplicationContext(它在Spring的實現中創建了一個依賴項),並且最重要的是它們不會在方法調用期間處理bean的創建(或者至少 - 我沒有 - 瞭解如何在調用過程中使用它們)。

請協助。

謝謝。

編輯:

最終我意識到,我必須爲使用CGLIB或Spring的應用程序上下文,我選擇使用service locator選項。

+0

有什麼問題要解決? - 我認爲你找不到合理答案的原因是,你想以不是春天的方式解決問題。 - 所以我問這個問題。 – Ralph 2014-09-28 16:32:59

+0

我不知道如何獲得託管bean的新實例,而不使用注入,但在方法調用期間。 – javaist 2014-09-29 07:46:57

回答

0

恐怕你必須使用CGLIB或ApplicationContext,因爲你想要一個託管bean

Lookup方法注射

添加lookup methodSomeClass

@Lookup 
private Client createClient() { 
    return null; // Never mind, this method will be overridden 
} 

然後在init(),你可以把它叫做:

client = createClient(); 

注意@Lookup註解是在春季推出4.1.0。如果您使用的是舊版本,則需要XML配置。

使用的ApplicationContext

聲明一個自動連線特性:

@Autowired 
private ApplicationContext applicationContext; 

而且在init()

client = applicationContext.getBean(Client.class); 
+0

謝謝。我意識到我必須使用CGLIB或Spring的應用程序上下文。最終,我決定使用服務定位器。 – javaist 2014-09-29 10:40:15

0

我想某些類型的工廠對您來說會是一個更好的選擇,您可以定義一個工廠方法,它將clientsNum作爲參數並返回一個給您的集合。這樣你可以隱藏服務類中的所有細節。 如果你仍然想使用依賴注入來做到這一點,你可以嘗試方法注入。看看下面的代碼來獲得一個想法。

@Component 
class SomeClass 
{ 
@Resource 
private ConnectionFactory conFactory; 
protected abstract Client createClient(); 

private Set <Client> clients; 

@Value ("${clientsNum}") 
private int clientsNum; 

public void init() 
{ 
    Client client = null; //an interface, that the managed bean implements. 

    for (int i = 0; i < clientsNum; i++) 
    { 
      client = createClient(); 
      clients.add (client); 
      client.doSomething(); 
    } 
} 

public void shutdown() 
{ 
    for (Client client : clients) 
      client.shutdown(); 

    conFactory.shutdown(); 
} 
} 

您可以通過簡單的谷歌搜索找到一個完整的方法注入示例。但我建議與第一個解決方案,它更乾淨。

0

我不知道如何得到管理的新實例bean,而不使用注入,但在方法調用期間。

注入春天ApplicationContextand然後使用ApplicationContext.getBean(...)

@Autowired 
private ApplicationContext applicationContext; 

public void init() 
{ 
    Client client = null; //an interface, that the managed bean implements. 
    for (int i = 0; i < clientsNum; i++) 
    { 
/*>>>>*/ client = applicationContext.getBean(Client.class); 
      clients.add (client); 
      client.doSomething(); 
    } 
} 
相關問題