2014-09-27 3 views
0

В Java EE 7, в чем цель и использование аннотации @Named здесь? Даже без этого контейнер должен иметь возможность открыть этот компонент во время выполнения, не так ли?Какая цель @Named аннотации

Также, как насчет @ Синглтона? Если разработчикам не нужно создавать несколько экземпляров в приложении, нет необходимости использовать 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, когда я нажимаю incrementA() или incrementB(), приращения neighter на 1. Значение остановился здесь 1.

2) Если я удаляю аннотацию @Named, она сообщает об исключении нулевого указателя.

Я изучаю Java EE и не совсем понимаю это поведение.
EDIT (как используются бобы):

<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 не будет доступен для использования в EL в JSF.

Без @Singleton bean - простой CDI ManagedBean. Вместо того, чтобы иметь только один экземпляр singleton, который подсчитывает, имеется один управляемый компонент для каждой области. Когда вы удаляете @Singleton, лучше всего добавить @SessionScoped или @ApplicationScoped в зависимости от того, хотите ли вы подсчитывать сеанс или все сеансы (например, с @Singleton).

+0

Какова точная причина того, что после удаления @Singleton счетчик не работает? Значения счетчика остаются равными 1, не увеличиваются. – marlon

+1

Я думаю, что это не значит, что значение остается таким же, но вы получаете новый экземпляр каждый раз, когда вы получаете доступ к вашему webapp. К сожалению, я не вижу, в каком контексте используется класс. –

+0

смотрите, как он используется. Очень просто. Это простая демонстрация, демонстрирующая концепцию singleton session bean. Вы имеете в виду каждый раз, когда я нажимаю «Приращение», у меня появился новый экземпляр? Но значение по умолчанию равно 1, даже если я нажимаю только один раз, новый экземпляр должен получить значение 2? – marlon

0

Одноэлементная аннотация сделать EJB уникальной во всем приложении EE (смотрите между потоками и запросами), довольно отличается от другие типы EJB, такие как Session Beans, которые имеют жизнь в сеансе и на этом сеансе поддерживают внутреннее состояние. Будьте осторожны: синглеты могут влиять на производительность при использовании в средах с высокой параллелизмом.

Что касается @Named, я не работаю над Java EE7, но я думаю, что он больше используется в JSF, чтобы дать другое имя тому, что было известно как ManagedBean (управляемые bean-версии устарели в новой версии Java EE). Просто если вы сделаете боб имени MyBean вы можете ссылаться на этот боб, как myBean в JSF страницы, если вы хотите использовать другое имя, которое вы можете использовать:

@Named («myNewBeanName»)

и вы может использовать myNewBeanName на страницах JSF.

+0

См. Отредактированные данные. Я тот же клиент, в том же браузере, и я постоянно нажимаю «Приращение».Каждый клик представляет собой один уникальный сеанс, который изменяется для каждого клика, или все клики представляют собой один общий сеанс, который является общим? Я понимаю, что это все одна сессия, так как я на одной странице и не открываю новую веб-страницу или новую вкладку. – marlon

+0

Без @Singleton, он становится фанатом без гражданства? Должны ли яблокированные бобы быть явно аннотированы «без гражданства»? – marlon

+0

Без @Singleton это уже не EJB, теперь это простой CDI-управляемый bean-компонент. –

0

С CDI вам понадобятся пара областей и спецификаторов для ваших компонентов. Синглтон - ваш пример области действия, а Named - ваш пример квалификатора. Квалификатор - это способ получения бина при поиске. Именованное специально используется при объединении в слое представления, чтобы ссылаться на него в представлении или аналогичном. Синглтон позволяет ему раскрываться как один экземпляр. Обратите внимание, что Singleton является спецификацией AtInject и не считается bean-определяющим, это не нормальная область. Чем больше CDI, тем лучше использовать ApplicationScoped. В любом случае будет создан один экземпляр вашего класса.

Квалификаторы являются необязательными, поэтому вам нужно только Именовать, если вы хотите сделать его доступным в пользовательском интерфейсе.

Смежные вопросы