CodeGym /Cursos Java /Módulo 5. Spring /Creación de instancias de un contenedor de IoC

Creación de instancias de un contenedor de IoC

Módulo 5. Spring
Nivel 1 , Lección 2
Disponible

La ruta o rutas de ubicación pasadas al constructor ApplicationContext son cadenas de recursos que permiten que el contenedor se cargue desde varios recursos externos, como el sistema de archivos local, Java CLASSPATH, y así sucesivamente.

Java
ApplicationContext contexto = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
Kotlin
val context = ClassPathXmlApplicationContext("services.xml", "daos.xml")

Después de explorar el contenedor Spring IoC, es posible que desee obtener más información sobre la abstracción Spring Resource, que proporciona un mecanismo conveniente para leer InputStreams desde lugares definidos en la sintaxis de URI. En particular, las rutas de Recursos se utilizan para crear contextos de aplicaciones.

El siguiente ejemplo muestra el archivo de configuración del objeto de la capa de servicio (services.xml):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- servicios -->
    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
        <nombre de propiedad="cuentaDao" ref="cuentaDao"/>
        <nombre de propiedad="itemDao" ref="itemDao"/>
        <!-- los objetos interoperables adicionales y la configuración para este bean se encuentran aquí -->
    </frijol>
    <!-- aquí hay más definiciones de beans para servicios -->
</beans>

El siguiente ejemplo muestra el archivo de objetos de acceso a datos daos.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="cuentaDao"
        class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
        <!-- los objetos interoperables adicionales y la configuración para este bean se encuentran aquí -->
    </frijol>
    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
        <!-- los objetos interoperables adicionales y la configuración para este bean se encuentran aquí -->
    </frijol>
    <!-- aquí encontrará más definiciones de beans para objetos de acceso a datos -->
</beans>

En el ejemplo anterior, la capa de servicio consta de una clase PetStoreServiceImpl y dos objetos de acceso a datos de tipos JpaAccountDao y JpaItemDao (basados en el estándar relacional de objetos JPA Object-Relational Mapping). El elemento property name se refiere al nombre de una propiedad JavaBean y el elemento ref se refiere al nombre de otra definición de bean. Esta relación entre los elementos id y ref expresa la dependencia entre objetos que interactúan.

Compilación de metadatos de configuración basados en XML

Esto puede resultar útil si las definiciones de beans abarcan varios archivos XML. Normalmente, un único archivo de configuración XML representa una capa o módulo lógico en la arquitectura.

Puede utilizar el diseñador de contexto de la aplicación para cargar definiciones de beans de todos estos fragmentos XML. Este constructor ocupa múltiples ubicaciones de Resource. Alternativamente, use una o más apariciones del elemento para cargar definiciones de beans desde otro archivo o archivos. El siguiente ejemplo muestra cómo hacer esto:

<beans>
    <importar recurso="servicios.xml"/>
    <importar recurso="recursos/messageSource.xml"/>
    <importar recurso="/resources/themeSource.xml"/>
    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>
</beans>

En el ejemplo anterior, las definiciones de beans externos se cargan desde tres archivos: services.xml, messageSource.xml y themeSource.xml. Todas las rutas de ubicación hacen referencia al archivo de definición que realiza la importación, por lo que services.xml debe estar en el mismo directorio o classpath que el archivo que realiza la importación, y messageSource.xml y themeSource.xml debe ubicarse en resources, ubicado debajo de la ubicación del archivo importado. Como puede ver, se ignora la barra diagonal inicial. Sin embargo, dado que estas rutas son relativas, es mejor no utilizar la barra diagonal en absoluto. El contenido de los archivos importados, incluido el elemento <bean/> de nivel superior, debe ser una definición de bean XML válida según el esquema Spring.

Es posible, aunque no recomendado, vincular archivos en directorios principales utilizando la ruta relativa "../". Esto crea una dependencia de un archivo que está fuera de la aplicación actual. En particular, no se recomienda dicha referencia para classpath: (por ejemplo, classpath:../services.xml), donde la "más cercana" se selecciona usando un procedimiento de resolución en tiempo de ejecución se busca la raíz del classpath y luego su directorio principal. Los cambios en la configuración de la ruta de clase pueden provocar que se seleccione un directorio diferente e incorrecto.

Siempre puedes utilizar ubicaciones de recursos completas en lugar de rutas relativas: por ejemplo, file:C:/config/services.xml o classpath:/config/services.xml . Sin embargo, tenga en cuenta que está vinculando la configuración de su aplicación a ubicaciones absolutas específicas. Generalmente es preferible preservar el direccionamiento indirecto para dichas ubicaciones absolutas, por ejemplo, a través de marcadores de posición "${....}" que se resuelven con las propiedades del sistema JVM en tiempo de ejecución.

El espacio de nombres en sí proporciona la posibilidad de utilizar la directiva de importación. Opciones de configuración adicionales más allá de las simples definiciones de beans están disponibles en algunos de los espacios de nombres XML proporcionados por Spring (por ejemplo, los espacios de nombres context y util).

Definición de contenedores usando Groovy DSL

Como ejemplo adicional de metadatos cuya configuración está externalizada, las definiciones de beans también se pueden expresar usando una definición a través de Groovy DSL en Spring, como se conoce del marco Grails. Normalmente esta configuración se encuentra en un archivo ".groovy" y tiene la estructura que se muestra en el siguiente ejemplo:

beans {
    fuente de datos (fuente de datos básica) {
        driverClassName = "org.hsqldb.jdbcDriver"
        URL = "jdbc:hsqldb:mem:grailsDB"
        nombre de usuario = "sa"
        contraseña = ""
        configuración = [minuevo:"configuración"]
    }
    fábrica de sesiones (fábrica de sesiones) {
        fuente de datos = fuente de datos
    }
    miServicio(MiServicio) {
        nestedBean = { Otro frijol Bean ->
            fuente de datos = fuente de datos
        }
    }
}

Este estilo de configuración es en gran medida equivalente a las definiciones de beans XML e incluso admite espacios de nombres XML de configuración Spring. También le permite importar archivos de definición de beans XML utilizando la directiva importBeans.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION