Jakarta ee @Named注解的目的是什么

Jakarta ee @Named注解的目的是什么,jakarta-ee,annotations,cdi,Jakarta Ee,Annotations,Cdi,在JavaEE7中,@Named注释的目的和用途是什么?即使没有它,容器也应该能够在运行时发现这个bean,对吗 还有,@Singleton do呢?若开发人员不需要在应用程序中创建多个实例,那个么这里就不需要使用单例,对吗 @Singleton @Named public class Counter { private int a = 1; private int b = 1; public void incrementA() { a++; } public void incre

在JavaEE7中,@Named注释的目的和用途是什么?即使没有它,容器也应该能够在运行时发现这个bean,对吗

还有,@Singleton do呢?若开发人员不需要在应用程序中创建多个实例,那个么这里就不需要使用单例,对吗

@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,当我单击递增A或递增B时,neighter递增1。该值保持为1

2如果我删除@Named注释,它会报告一个空指针异常

我正在学习JavaEE,但不太了解这种行为。 编辑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>

~

单例注释使整个EE应用程序中的EJB看起来在线程和请求之间共享,这与其他类型的EJB(如会话bean)非常不同,会话bean在会话中有生命,并且在会话中保持内部状态。小心:在高并发环境中使用单例可能会影响性能

关于@Named,我不在JavaEE7上工作,但我认为在JSF中更多的是使用它来给被称为ManagedBean的东西起一个不同的名字。在JavaEE的新版本中,ManagedBean被弃用。简单地说,如果您创建了一个名为MyBean的bean,您可以在JSF页面中将该bean称为MyBean,如果您想使用不同的名称,您可以使用:

@NamedmyNewBeanName


您可以在JSF页面中使用myNewBeanName。

如果不使用@Named,则该Bean将无法在JSF中的EL中使用

没有@Singleton,bean就是一个普通的CDI ManagedBean。
每个作用域都有一个托管Bean,而不是只有一个单独的实例。删除@Singleton时,最好添加@SessionScoped或@ApplicationScoped,这取决于您是想像使用@Singleton那样计算每个会话还是所有会话。

使用CDI时,您的bean需要一对作用域和限定符。Singleton是范围的示例,Named是限定符的示例。限定符是在查找bean时如何派生的。当在表示层中组合以在视图或类似视图中引用它时,会专门使用“命名”。Singleton允许它作为单个实例公开。注意,Singleton来自AtInject规范,不被认为是bean定义,它不是一个普通的作用域。更以CDI为中心的方法是使用ApplicationScoped。无论哪种方式,都将创建类的单个实例


限定符是可选的,因此如果您想在UI中使用它,您只需要命名。

删除@Singleton后,计数器不起作用的确切原因是什么?计数器的值保持在1,不会增加。我认为不是值保持不变,而是每次访问webapp时都会得到一个新实例。不幸的是,我看不出该类在什么上下文中使用。请查看它是如何使用的。很简单。这是一个简单的演示,演示了单例会话bean的概念。你是说每次我点击增量,我都会得到一个新的实例?但默认值为1,即使我只单击一次,新实例的值也应为2?在同一页面、同一浏览器会话中,我单击相同的按钮增量。该值可能会更改,也可能不会更改,这取决于是否将@Singleton添加到类中。默认情况下,@不是命名为Singleton吗?你为什么两者都需要?请查看已编辑的详细信息。我是同一个客户端,在同一个浏览器中,我不断单击“增量”。每次单击代表一个独特的会话,每次单击都会更改,或者所有单击代表一个共享的公共会话?我的理解是,这都是一个会话,因为我在同一个页面上,没有打开新的网页或新的选项卡。没有@Singleton,它会变成无状态bean吗?无状态bean是否必须用无状态进行显式注释?如果没有@Singleton,它就不再是EJB,现在是一个普通的CDI管理bean。关于计数,计数器使用的范围是默认的atDependent,因此每次调用页面时都会使用一个新实例。请参阅:如果将atSessionScoped添加到类中,则计数器应计数每个会话。您好,来自Oracle J7EE教程:Hello类,称为托管bean类,为Facelets页面表达式中使用的name属性提供getter和setter方法。默认情况下,表达式语言引用类名,第一个字母用小写字母[…]如果使用bean类的默认名称,则可以将Model指定为注释,而不必同时指定Named和RequestScoped。模型注释称为原型(stereotype),是封装其他注释的注释的术语。因此,如果不使用单例,Bean将不会是EJB。