2012-04-29 36 views
0

就簡單性和正確性而言,用不同範圍注入同一類的對象的最佳方法是什麼?如何用不同的作用域注入同一類的對象?

在一個servlet中,我想注入具有不同作用域的相同類的對象。 還不知道是否要使用jsf。

  • 簡單性:使每個作用域的Qualifier和生產者方法太多;製作一個界面,兩個類的加入和替代在beans.xml也是太多了;有一個Address#isCurrent()方法沒有意義。
  • 正確性:JSR299,3.11說:不建議使用@Named作爲注入點限定符。仍然不知道爲什麼。
    儘管在注射點使用@Named@ApplicationScoped@RequestScoped一起使用,但不與@SessionScoped一起使用。請參閱下面的名爲片段

在春天,它是很容易的:
春片斷

<bean id="currentAddress" class="xxx.Address" scope="session" /> 
<bean id="newAddress" class="xxx.Address" scope="request" /> 
<bean id="servlet" class="xxx.MyServlet"> 
<property name="currentAddress" ref="currentAddress" /> 
<property name="newAddress" ref="newAddress" /> 
</bean> 


命名片段

/* Address class */ 
@Produces @RequestScoped @Named(value="request") 
public Address getNewAddress(){ 
return new Address(); 
} 

@Produces @SessionScoped @Named(value="application") 
public Address getCurrentAddress(){ 
return new Address(); 
} 
/* Servlet */ 
@Inject @RequestScoped @Named("request") private Address newAddress; 
@Inject @ApplicationScoped @Named("application") private Address currentAddress; 

回答

1

感謝@ nsfyn55指出good article,在閱讀「正確的方式」一節後,我想出了我認爲在簡單性和正確性方面實現它的最佳方法。

所以我只使用一個接口作爲限定符註釋。

/* Qualifier annotation */ 
@Qualifier 
@Retention(RUNTIME) 
@Target({FIELD,METHOD}) 
public @interface Scope { 

Type value(); 

enum Type { REQUEST, SESSION, APPLICATION }; 
} 


/* Address class */ 
@Produces @Scope(REQUEST) @RequestScoped 
public Address request() { 
return new Address(); 
} 

@Produces @Scope(SESSION) @SessionScoped 
public Address session() { 
return new Address(); 
} 

/* Servlet */ 
@Inject @Scope(REQUEST) 
private Address newAddress; 

@Inject @Scope(SESSION) 
private Address currentAddress; 
2

的原因包括這一建議的是一樣的道理人們寧願使用Enumeration覆蓋任意字符串常數,這是因爲它不是類型安全的。你可以輕易地錯誤地輸入類的名字,它會在運行時很好地編譯和失敗。包含的建議是因爲在大多數情況下@named會在編譯時有能力強制這些約束條件時使應用程序不必要地變得脆弱。

這裏是一個good article,列出的理由:

來處理這種情況的首選方法是使用@Qualifiers用枚舉值。查看標題爲「字符串限定符是遺留的」和「正確的方法」的章節來解決這個問題。

+0

非常感謝您的回答。 我可以看到阻止@Named(「string」)練習的原因。 在閱讀了您建議的文章之後,我帶來了一個我更喜歡的新想法:對這兩種方法只有一個限定符。我會在稍後嘗試。 – user454322

+0

我編輯了那篇文章,我已經注意到@Qualifier註解作爲處理這個問題的首選方法。 – nsfyn55

+0

謝謝,我只是添加了我的答案與片段 – user454322

相關問題