2011-04-15 11 views
6

¿Cómo sabe una aplicación que utiliza el SimpleNamingContextBuilder de Spring como su proveedor JNDI para buscar recursos en su directorio? ¿Qué vincula la aplicación con el directorio de nombres de Spring? Por ejemplo, ¿cómo sabe el bean JndiObjectFactoryBean en este anterior answer encontrar el recurso my-db en el directorio Spring? ¿No requiere JndiObjectFactoryBean un entorno de contexto con la propiedad java.naming.factory.initial establecida en alguna implementación de la interfaz InitialContextFactory? ¿Cuál debería ser el valor de java.naming.factory.initial al usar SimpleNamingContextBuilder como el proveedor JNDI?¿Cómo sabe una aplicación que utiliza SimpleNamingContextBuilder de Spring para buscar recursos en su directorio?

Respuesta

8

La clase de tiempo de ejecución de Java NamingManager sirve como enlace entre una aplicación Java y su directorio de nombres. Cuando se SimpleNamingContextBuilderactivates, se instala en el miembro estático InitialContextFactoryBuilder en NamingManager. Cuando la aplicación crea un InitialContext para recuperar el contexto JNDI, la clase InitialContext delega a NamingManager, que a su vez pregunta al IntialContextFactoryBuilder (en este caso, SimpleNamingContextBuilder) para crear un IntialContextFactory, que finalmente crea el InitialContext.

JndiObjectFactoryBean no necesita un entorno contexto explícito porque SimpleNamingContextBuilder proporciona la InitialContextFactory a la NamingManager y JndiObjectFactoryBean utiliza el NamingManager para recuperar sus recursos. Por lo tanto, en la respuesta anterior, JndiObjectFactoryBean "sabe" buscar en el directorio de nombres de Spring el recurso my-db porque SimpleNamingContextBuilder se ha establecido como el proveedor JNDI en el NamingManager.

13

En pocas palabras, si quiere simular el árbol JNDI con prueba de falsa InitialContext en pruebas unitarias, se puede utilizar SimpleNamingContextBuilder. Instalé SimpleNamingContextBuildeit en un método de prueba de inicio y creo con éxito un InitialContext en memoria. p. en una clase de prueba de primavera ..

@BeforeClass 
    public static void setupJndi() throws Exception { 
    SimpleNamingContextBuilder.emptyActivatedContextBuilder(); 
    Context context = new InitialContext(); 
    context.bind("java:comp/env/jms/ConnectionFactory",myJmsConnectionFactory); 
    } 
+1

¡Buen ejemplo! Esto ilustra mi punto de que cuando activa un 'SimpleNamingContextBuilder', se instala a sí mismo como el contexto JNDI predeterminado. –

Cuestiones relacionadas