2014-09-27 77 views
0

在Java EE 7中,這裏有@Named註釋的用途和用途是什麼?即使沒有它,容器應該能夠在運行時發現這個bean,對吧?@命名註釋的目的是什麼

另外,@Singleton呢?如果開發人員不需要在應用程序中創建多個實例,那麼在這裏不需要使用singleton,對吧?

@Singleton 
@Named 
public class Counter { 

private int a = 1; 
private int b = 1; 

public void incrementA() { 
    a++; 
} 

public void incrementB() { 
    b++; 
} 

public int getA() { 
    return a; 
} 

public int getB() { 
    return b; 
} 
} 

我做了兩項測試:

1)如果我刪除了@Singleton,當我通過1.單擊增量型的()或incrementB(),neighter增量值停留在1

2)如果我刪除@Named註釋,它會報告一個空指針異常。

我正在學習Java EE,不太明白這種行爲。
EDIT(bean的使用方式):

<html lang="en" xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
<body> 
    <ui:composition template="/template.xhtml"> 
      <ui:define name="title"> 
     Helloworld EJB 3.1 Singleton Quickstart 
      </ui:define> 
      <ui:define name="body"> 
    <p> 
     This example demonstrates a singleton session bean that maintains state for 2 variables: <code>a</code> and <code>b</code>. 
    </p> 
        <p> 
     A counter is incremented when you click on the 
          link to the variable name. If you close and restart your browser, or 
          if you have multiple browsers, you can see that the counter always 
          increments the last value. These values are maintained until you 
          restart the application. To test the singleton bean, click on either 
          "Increment" button below. 
    </p> 
       <table> 
     <tr> 
      <h:form> 
       <td><b>Counter A</b></td><td><h:commandButton value="Increment" action="#{counter.incrementA}" /></td><td>#{counter.a}</td> 
      </h:form> 
     </tr> 
     <tr> 
      <h:form> 
       <td><b>Counter B</b></td><td><h:commandButton value="Increment" action="#{counter.incrementB}" /></td><td>#{counter.b}</td> 
      </h:form> 
     </tr> 
    </table> 
      </ui:define> 
    </ui:composition> 

回答

0

沒有@Name的Bean將不能在JSF的EL中使用。

沒有@Singleton這個bean是一個普通的CDI ManagedBean。 不是每個作用域都有一個單個實例,而是有一個Managed Bean。在刪除@Singleton時,最好添加@SessionScoped或@ApplicationScoped,具體取決於您是要計算每個會話還是通過所有會話(就像使用@Singleton一樣)。

+0

一旦@Singleton被移除,計數器不起作用的確切原因是什麼?計數器的值保持在1,不增加。 – marlon 2014-09-27 17:27:37

+1

我認爲這不是價值保持不變,而是每次訪問您的webapp時都會得到一個新實例。不幸的是,我無法看出這個班級在什麼情況下使用。 – 2014-09-27 17:44:30

+0

請看它是如何使用的。很簡單。這是一個演示單例會話bean概念的簡單演示。你的意思是每次我點擊「增量」,我得到一個新的實例?但默認值是1,即使我只點擊一次,新實例的值應該是2? – marlon 2014-09-28 02:27:29

0

的單註釋作出EJB在整個EE應用程序(看線程和請求之間共享)的獨特,是相當不同其他類型的EJB(如會話Bean)在Session中有生命,並在該會話中保持內部狀態。小心:在高併發環境中使用時,單例可能會影響性能。

@Named怎麼樣,我沒有在Java EE7上工作,但我認爲更多的用在JSF中,以稱爲ManagedBean(託管bean在新版本的Java EE中不推薦使用)。只是如果你犯了一個名爲豆爲myBean的可以參考該bean作爲爲myBean在JSF頁面,如果你想使用一個不同的名稱,你可以使用:

@Named(「myNewBeanName」)

和你可以在JSF頁面中使用myNewBeanName。

+0

請參閱編輯的詳細信息。我是同一個客戶,在同一個瀏覽器中,我不斷點擊「增量」。每次點擊代表每次點擊更改的唯一會話,或者所有點擊代表共享的一個常見會話?我的理解是,這只是一個會話,因爲我在同一頁面上,並沒有打開新的網頁或新的標籤頁。 – marlon 2014-09-28 02:48:19

+0

沒有@Singleton,它會變成無狀態bean嗎?無狀態豆必須用「無狀態」來明確標註嗎? – marlon 2014-09-28 02:59:39

+0

如果沒有@Singleton,它不再是一個EJB,它現在是一個普通的CDI託管bean。 – 2014-09-28 06:47:07

0

使用CDI,您需要一對適用於您的bean的範圍和限定符。 Singleton是範圍的例子,Named是你的限定詞的例子。限定符是查找bean時如何派生的。命名是特別用於在表示層中組合以在視圖或類似中引用它。 Singleton允許它作爲單個實例公開。請注意,Singleton來自AtInject規範,並不認爲是bean定義,它不是一個正常的範圍。以CDI爲中心的方法是使用ApplicationScoped。無論哪種方式,您的類的單個實例將被創建。

限定符是可選的,所以你只需要命名,如果你想讓它在UI中可用。

相關問題