= CDI @ApplicationScoped
:index-group: CDI
:jbake-type: page
:jbake-status: published

Este ejemplo muestra el uso de la anotacioón `@ApplicationScoped` para inyección de objetos. 
Un objeto deberia ser definido como `@ApplicationScoped` y se crea una vez durante la ejecución de la aplicación.

== Ejemplo

Este ejemplo muestra un escenario similar a cdi-request-scope.

[source,java]
----
Un huésped del restaurante ordena una sopa al camarero.
El camarero luego le devuelve la sopa al huésped.
Otro huésped puede pedir la misma sopa que ordenó el cliente anterior.
----

Aquí es donde se utiliza el alcance de la aplicación.

=== Camarero

El bean de sesión `Waiter` recibe una solicitud de la clase de ejemplo a través del método `orderSoup()` y establece el nombre para el campo `soup`.

El método `orderWhatTheOtherGuyHad()` devuelve el nombre del campo `soup`.


[source,java]
----
@Stateless
public class Waiter {

    @Inject
    public Soup soup;

    public String orderSoup(String name){
        soup.setName(name);
        return soup.getName();
    }

    public String orderWhatTheOtherGuyHad() {
        String name = soup.getName();
        return name;
    }
}
----

=== Sopa

La clase `Soup` es un POJO inyectable, definido como `@ApplicationScoped`.
Esto significa que una instancia se creará solo una vez durante toda la aplicación.
Ahora intente cambiar la anotación `@ApplicationScoped` a `@RequestScoped` y vea qué sucede.

[source,java]
----
@ApplicationScoped
public class Soup {

    private String name = "Soup of the day";

    @PostConstruct
    public void afterCreate() {
        System.out.println("Soup created");
    }

    public String getName() {
        return name;
    }

    public void setName(String name){
        this.name = name;
    }
}
----

== Caso de prueba

Esta es la clase de entrada para este ejemplo.
Primero se ordena una sopa a través del método `orderSoup()`.
Esto inicia el campo `soup`.
A continuación, el método `orderWhatTheOtherGuyHad()` devuelve la sopa del contexto de la aplicación.

[source,java]
----
public class RestaurantTest {

    private static String TOMATO_SOUP = "Tomato Soup";
    private EJBContainer container;

    @EJB
    private Waiter joe;

    @Before
    public void startContainer() throws Exception {
        container = EJBContainer.createEJBContainer();
        container.getContext().bind("inject", this);
    }

    @Test
    public void orderSoup(){
        String someSoup = joe.orderSoup(TOMATO_SOUP);
        assertEquals(TOMATO_SOUP, someSoup);

        String sameSoup = joe.orderWhatTheOtherGuyHad();
        assertEquals(TOMATO_SOUP, sameSoup);
    }

    @After
    public void closeContainer() throws Exception {
        container.close();
    }
}
----

== Ejecución

En el resultado de la ejecución puede ver que solo se creó una instancia de `Soup`, una para toda la aplicación.

[source,console]
----
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.superbiz.cdi.applicationscope.RestaurantTest
Apache OpenEJB 7.0.0-SNAPSHOT    build: 20111224-11:09
http://tomee.apache.org/
INFO - openejb.home = C:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-application-scope
INFO - openejb.base = C:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-application-scope
INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
INFO - Found EjbModule in classpath: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-application-scope\target\classes
INFO - Beginning load: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-application-scope\target\classes
INFO - Configuring enterprise application: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-application-scope
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean cdi-application-scope.Comp: Container(type=MANAGED, id=Default Managed Container)
INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
INFO - Auto-creating a container for bean Waiter: Container(type=STATELESS, id=Default Stateless Container)
INFO - Enterprise application "c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-application-scope" loaded.
INFO - Assembling app: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-application-scope
INFO - Jndi(name="java:global/cdi-application-scope/Waiter!org.superbiz.cdi.applicationscope.Waiter")
INFO - Jndi(name="java:global/cdi-application-scope/Waiter")
INFO - Created Ejb(deployment-id=Waiter, ejb-name=Waiter, container=Default Stateless Container)
INFO - Started Ejb(deployment-id=Waiter, ejb-name=Waiter, container=Default Stateless Container)
INFO - Deployed Application(path=c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-application-scope)
Soup created
INFO - Undeploying app: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-application-scope
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.42 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
----
