2015-07-12 23 views
2

我只是想知道一個好的建築設計是什麼樣子。從組件bean獲取原型bean的正確設計模式是什麼?

  • 比方說,我們有一個CarRepository它管理Car類型的所有豆類在汽車租賃申請。
  • Car豆型樣機
  • CarRepository豆的類型庫(單)現在
  • ,則CarRepository被要求創建一個新的Car豆,例如當時租賃公司已經買了一輛新車。

當然,我可以實現ApplicatioContextAware和使用context.getBean("car"),但對我來說,它不適合很好地依賴注入的想法。將短壽命bean注入單例最佳做法是什麼?

更新:也許我要補充一個例子,以使其更清晰。

+0

您的汽車類不應該出現在這樣的情況下,一個bean。它應該可能是一個實體。查看JPA/Spring數據。 – Apokralipsa

回答

1

Spring提供處理注入更長壽命的一個較短的壽命豆的機制。它被稱爲作用域代理。它的工作原理是單例注入一個代理,該代理將通過搜索較短的作用域(如會話或請求)來處理方法調用,並將其委託給該實例。

你沒有指定,如果您使用的XML或註釋來配置你的應用程序,或者你使用的是什麼版本的春天。您可以閱讀更多關於使用xml在reference guide中配置範圍代理的信息。我將給你一個例子,說明如何在Spring 4-ish環境中使用註釋對其進行配置。

對我來說,最好的辦法是使用元註釋機制。它允許您創建自己的註釋,以供Spring稍後用於配置您的應用程序。例如:

@Retention(RUNTIME) 
@Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopedProxyMode.TARGET_CLASS) 
public @interface SessionScoped{ 
} 

這樣的註釋,當在@Component(或@Service或任何其它專門化)類或在Java配置一個@Bean方法中指定將導致豆被注入作爲代理。例如:

@Configuration 
@EnableAspectJAutoProxy 
public class MyConfig{ 

    @SessionScoped 
    @Bean 
    public MyClass myBean(){ 
     // return your bean 
    } 
} 

之所以這麼說,你的例子真的讓我覺得你應該與實體(汽車)和存儲庫來工作。見Spring Data如果你正在設計的模型層,並要在數據庫中存儲等汽車數據

+0

我增加了一個例子,使其更加清晰。我會看看你的提示和鏈接 - 謝謝!我使用的是Spring 4.1和基於註釋的配置 – Christian

+0

而我在這種情況下用粗體顯示了我答案中最重要的部分:) – Apokralipsa

+0

謝謝!我會在接下來的日子裏弄清楚。只是爲了我的理解:除了這個例子之外還有什麼可能?因此,讓我們說這不是關於存儲庫和實體,而是一些應用程序邏輯,我有一個單身bean和一些壽命較短的(原型)bean ... **如何獲取注入singleton bean的新原型bean?* * – Christian

0

如果你不想使用context.getBean(...),那麼,你可以構造使用new Car(...)車,因爲這將有同樣的效果。

這些是隻有兩個辦法!

+0

並非如此,如果汽車bean被注入任何其他依賴或由Spring以任何其他方式管理。 – Apokralipsa

+0

...尤其是它不適合我對依賴注入的理解。在我的CarRepository中,我想聲明我需要什麼(原型)bean ...並且不訪問spring context來獲取我自己的bean。 – Christian

+0

@Apokralipsa通常情況下,汽車似乎並不是你想讓Spring管理的東西。我們都寫了DAO(aka Repository),上次有人使用Prototype bean for Entities –