Inyección de recursos en Java EE

El concepto de inyección de recursos se puede utilizar para inyectar cualquier recurso disponible en el espacio de nombres JNDI (Java Naming and Directory Interface) en cualquier objeto gestionado por contenedor, como un servlet, un bean, etc. Por ejemplo, la inyección de recursos se puede utilizar para inyectar fuentes de datos, conectores (como conectores de bases de datos) o recursos personalizados que están disponibles en el espacio de nombres JNDI. JNDI permite la simplificación de una construcción de recursos en solo un nombre, agrupando así muchos detalles en uno solo por conveniencia/seguridad/etc. El tipo utilizado para referirse a la instancia inyectada suele ser una interfaz, que desacopla el código de la aplicación de la implementación del recurso. Hay un escenario para explicar este concepto.

Ejemplo

Una única conexión de base de datos no se escalará para múltiples usuarios web, mientras que los grupos de conexiones de bases de datos permiten que las aplicaciones web se escalen y manejen múltiples usuarios rápidamente. La agrupación de conexiones se puede lograr como se muestra a continuación:

contexto.xml

XML

<Context>
    <Resource name="jdbc/test" 
              auth="Container" 
              type="javax.sql.DataSource" 
              maxActive="20" 
              maxIdle="5"
              maxWait="10000"
              username="postgres" 
              password="password" 
              driverClassName="org.postgresql.Driver"
              url="jdbc:postgresql://localhost:5432/test?allowPublicKeyRetrieval=true"/>
</Context>

Como se mencionó anteriormente, todo el recurso se simplifica en un nombre «jdbc/test» y el servidor Tomcat se encargará de la autenticación. Ahora el recurso se puede inyectar en otro lugar donde sea necesario. En este caso, se inyecta en un servlet que se puede usar en otro lugar. 

Nota : El siguiente fragmento de código es solo el código Java parcial para el servlet dado, se debe seguir la sintaxis adecuada al escribir la clase de servlet.

ControladorServlet.java

Java

import javax.sql.DataSource;
  
@Resource(name="jdbc/test")
private DataSource ds;

La anotación @Resource, que se encuentra en el paquete javax.annotation, se utiliza para inyectar el recurso en la clase de servlet. Ahora, «ds» es la palabra clave que se utilizará para inyectar el recurso en otro lugar. Como ejemplo:

ControllerServlet.java (continuación)

Java

private StudentDbUtil studentDbUtil = new StudentDbUtil(ds);

Ahora el control va a otra clase de Java desde el servlet donde se inyecta el recurso. 

Nota : El siguiente fragmento de código es solo el código Java parcial para el servlet dado, se debe seguir la sintaxis adecuada al escribir la clase de servlet.

StudentDbUtil.java

Java

public StudentDbUtil(DataSource theDataSource) {
    private DataSource dataSource = theDataSource;
}

Luego de esto, se utiliza la palabra clave “dataSource” para establecer la conexión utilizando las credenciales que se definieron inicialmente en el archivo context.xml. El fragmento de código final completa la explicación del concepto de inyección de recursos.

StudentDbUtil.java (continuación)

Java

// "dataSource" resource is used here
myConn = dataSource.getConnection(); 
    
// create sql statement
String sql = "select * from students order by studentid";
    
myStmt = myConn.createStatement();
    
// execute query
myRs = myStmt.executeQuery(sql);

En resumen, estos son los pasos que se llevan a cabo en todo el proceso:

  1. Las credenciales para conectarse con la base de datos (junto con la agrupación de conexiones) se definen en el archivo context.xml como un recurso que asigna un nombre al recurso.
  2. El recurso se inyecta en el servlet de Java usando el nombre del recurso.
  3. Posteriormente, el recurso se pasa a la clase Java donde se establecerá la conexión con la base de datos y se invocará el conjunto de conexiones a medida que se invoque el recurso.

El ejemplo mencionado anteriormente es el caso de uso de la inyección de recursos que proporciona ventajas como la reducción de la repetición de código, la inyección directa de recursos JNDI en varias clases de Java, etc.

Publicación traducida automáticamente

Artículo escrito por anishnarayan_p y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *