2014-09-27 4 views
0

Java EE 7에서는 @Named 주석의 목적과 용도는 무엇입니까? 그것 없이도 컨테이너는 런타임에이 빈을 발견 할 수 있어야합니다.@Named annotation의 목적은 무엇입니까?

또한 @Singleton은 어떤 역할을합니까? 개발자가 애플리케이션에서 다중 인스턴스를 생성 할 필요가 없다면 여기에서 싱글 톤을 사용할 필요가 없습니다.

1) 내가 @Singleton을 제거하면 나는 1로 incrementA() 또는 incrementB(), neighter 단위를 클릭 할 때, 값은 1

에서 숙박 :

@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; 
} 
} 

나는 두 가지 테스트를했다

2) @Named 주석을 제거하면 null 포인터 예외가보고됩니다.

Java EE를 배우고 있지만이 동작을 잘 이해하지 못했습니다. (빈 사용 방법)
편집 :

<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

@Named가 없으면 Bean을 JSF의 EL에서 사용할 수 없습니다.

@Singleton이 없으면 bean은 일반 CDI ManagedBean입니다. 정확히 하나의 싱글 톤 인스턴스가있는 대신 범위 당 하나의 Managed Bean이 있습니다. @Singleton을 제거 할 때 세션 당 또는 @Singleton과 같은 모든 세션에서 계산할 것인지에 따라 @SessionScoped 또는 @ApplicationScoped를 추가하는 것이 가장 좋습니다.

+0

일단 @Singleton이 제거되면 카운터가 작동하지 않는 정확한 이유는 무엇입니까? 카운터의 값은 1로 유지되고 증가하지 않습니다. – marlon

+1

값이 동일하게 유지되지만 웹 응용 프로그램에 액세스 할 때마다 새 인스턴스를 얻는 것은 아니라고 생각합니다. 불행히도 나는 어떤 상황에서 클래스가 사용되는지를 볼 수 없다. –

+0

어떻게 사용되는지 확인하십시오. 아주 간단합니다. 이것은 싱글 톤 세션 빈의 개념을 보여주는 간단한 데모입니다. "Increment"를 클릭 할 때마다 새로운 인스턴스가 생깁니 까? 하지만 기본 값은 1입니다. 단 한 번 클릭해도 새 인스턴스의 값은 2가되어야합니까? – marlon

0

싱글 톤 주석이 전체 EE 응용 프로그램 (스레드와 요청 사이에서 공유 볼)의 EJB 고유하게는,에서 꽤 다르다 Session Bean과 같은 다른 유형의 EJB는 세션에서 그리고 그 세션에서 수명을 가지며 내부 상태를 유지합니다. 주의 : 싱글 톤은 높은 동시성 환경에서 사용될 때 성능에 영향을 미칠 수 있습니다.

@Named는 Java EE7에서 작동하지 않지만 JSF에서 ManagedBean (관리되는 Bean은 Java EE의 새 버전에서 사용되지 않음)으로 알려진 이름에 다른 이름을 부여하는 데 더 많이 사용됩니다. 당신이 만드는 간단히 경우라는 이름의 빈 당신이 사용할 수있는 다른 이름을 사용하려는 경우 당신이 JSF 페이지에에서 myBean으로 그 빈을 참조 할 수 있습니다에서 myBean :

@Named ("myNewBeanName")

을하고 JSF 페이지에서 myNewBeanName을 사용할 수 있습니다.

+0

편집 된 세부 정보를 참조하십시오. 나는 같은 클라이언트인데, 계속해서 "Increment"를 클릭한다.클릭 할 때마다 각 클릭에 대해 변경되는 고유 한 세션을 나타내거나 모든 클릭이 공유되는 하나의 공통 세션을 나타냅니다. 그것이 동일한 페이지에 있고 새로운 웹 페이지 또는 새 탭을 열지 않았기 때문에 나의 이해는 모든 세션이라는 것입니다. – marlon

+0

@Singleton이 없다면, 그것은 상태없는 빈이 될까요? 상태없는 빈은 "stateless"로 명시 적으로 주석을 달아야합니까? – marlon

+0

@Singleton이 없으면 더 이상 EJB가 아닙니다. 이제는 일반 CDI 관리 빈입니다. –

0

CDI를 사용하면 bean에 대해 하나의 범위와 한정자가 필요합니다. Singleton은 범위의 예이고 Named는 한정자의 예입니다. 한정자는 검색 될 때 bean이 파생되는 방법입니다. 명명 된 이름은 프리젠 테이션 레이어에서 결합되어 뷰 또는 유사하게 참조 될 때 특별히 사용됩니다. Singleton은 단일 인스턴스로 노출되도록합니다. Singleton은 AtInject 스펙에서 왔으며 Bean 정의로 간주되지 않으므로 정상 범위가 아닙니다. CDI 중심의 방법으로 ApplicationScoped를 사용하는 것이 더 중요합니다. 어느 쪽이든, 클래스의 단일 인스턴스가 생성됩니다.

한정자는 선택 사항이므로 UI에서 사용할 수 있도록하려면 한정자 만 있으면됩니다.

관련 문제