2011-07-03 12 views
8

Al estudiar JSR-299, leo la sección 5.1 de Weld reference que explica cómo funcionan los ámbitos en CDI. Aparentemente, el contexto es un concepto estrechamente relacionado con el alcance. He entendido un poco sobre lo que cada uno es, pero no está muy claramente separado en mi mente y me siento tentado de usar las palabras de manera intercambiable.La diferencia entre contexto y alcance en CDI - y Java en absoluto

¿Cuál es la diferencia entre el alcance y el contexto? ¿Cuál es la relación entre los dos conceptos?

Espero una respuesta en el dominio CDI pero es una duda que tengo sobre Java en general, ya que los conceptos también se usan en otros contextos. En realidad, una respuesta que explique los conceptos en el contexto de CDI, Java y en general obtendría más puntos, si pudiera darlos.

Respuesta

6

Cada ámbito tiene un contexto separado.

El contexto es un contenedor para beans que se han definido con el ámbito respectivo.

Es por eso que las implementaciones de contexto llevan el nombre del ámbito - ApplicationContext, DependentContext, RequestContext, etc.

Este es un detalle de implementación en realidad - como usuario de CDI sólo se debe saber acerca de los ámbitos (porque usted lo define para sus beans), y la implementación decide dónde colocar esos beans y cómo administrar su ciclo de vida.

+1

Buen punto. Permítanme agregar que en Seam 2 ** context ** fue el concepto que el usuario conocía bien ('@ In',' @ Out'), mientras que en CDI ** scope ** es el camino a seguir. Esto sin duda es un cambio de perspectiva. –

+0

¿Dónde puedo obtener más información sobre estas clases de contexto (Javadoc u otra documentación)? – Puce

+0

http://docs.oracle.com/javaee/6/tutorial/doc/giwhb.html – Bozho

2

Mi comprensión es que el alcance se refiere a dónde se puede acceder a un objeto, mientras que el contexto enumera los objetos a los que se puede acceder desde un punto particular en la ejecución del programa. (Es decir, hablamos sobre el alcance de un objeto y el contexto en un punto particular de la ejecución del programa.)

Hablando matemáticamente, ambos describen la relación de acceso a la can, pero mírenla en diferentes direcciones.

+0

probablemente sea más exacto decir el alcance de una * variable * – irreputable

+0

Aunque estoy de acuerdo con eso en general, eso sería engañoso cuando se habla de CDI, ya que CDI realmente define ámbitos para objetos, no variables. (En CDI, un objeto se queda fuera del alcance (y por lo tanto se destruye) completamente independiente de cualquier variable que lo señale). – meriton

+0

no 'variable' en el sentido de Java, pero en sentido general. si dos sesiones pueden compartir un objeto, no es apropiado hablar sobre * el * alcance de la sesión del * objeto *. – irreputable

1

Primero, tenemos conceptos en mente como aplicaciones, sesiones, solicitudes. Usemos el concepto de sesión en los siguientes ejemplos.

Si consideramos que una parte de ejecución está sirviendo para una sesión particular, diremos que la sesión es parte del contexto de la ejecución; o bien, es el contexto de sesión de la ejecución.

Una sesión tiene algunas variables, p. userName; diremos que la sesión es el alcance de estas variables.

Dado que ambos apuntan a la misma sesión, puede ser confuso. Por ejemplo,

get the userName from the session context 
get the userName from the session scope 

ambos suenan bien, porque estamos hablando de una ejecución en una variable.

El siguiente ejemplo es inteligible por la definición del alcance

the scope of the injected bean is Session 

pero no tienen problemas para entender lo que realmente está pasando. Si queremos, podemos expandirlo hasta que se base en los usos básicos de las palabras; no hacemos eso porque será muy detallado.

Un autor se enfrenta a la difícil tarea de empaquetar las palabras de manera sucinta pero espera que los lectores de alguna manera comprendan el significado complejo.Los textos sobre el contexto y el alcance generalmente parecen ser un galimatías para aquellos que no han entendido los conceptos.

Los nombres de API son aún más difíciles de encontrar, porque los códigos no son oraciones en inglés. Context o Scope son bastante intercambiables. Si solo hay un objeto que representa una sesión, la clase probablemente debería llamarse simplemente Session. Si dividimos la parte sobre la manipulación de variables, esa parte se puede llamar SessionScope. Sin embargo, el significado de SessionContext es demasiado elusivo, lo mejor que podemos decir, solo por el nombre, es que se trata de algo así como una sesión: el "contexto" aquí es más o menos un improperio.

+0

Mi problema es exactamente explicar qué son contextos y alcances en un artículo. Tanto su explicación como la de Meriton tienen sentido para mí y parece hablar más o menos de lo mismo, aunque he encontrado que su explicación está más alineada con lo que "siento". Mi esperanza era obtener algunas definiciones estándar y ampliamente adoptadas, pero aparentemente tendré que elegir mi propia definición, desafortunadamente ... – brandizzi

Cuestiones relacionadas