Injeção de recursos permite injetar qualquer recurso disponível no namespace JNDI em qualquer objeto gerenciado pelo container, como uma servlet, um bean corporativo, ou um bean gerenciado. Por exemplo, você pode usar a injeção de recursos para injetar fontes de dados, conectores ou recursos personalizados disponíveis no namespace JNDI.

O tipo utilizado para referênciar a instância que será injetada é geralmente uma interface, que separa o código da implementação do recurso.

O código abaixo injeta um objeto de fonte de dados que fornece conexões com o banco de dados através de um DataSource. Se estiver usando o Apache Tomcat e não saiba como criar um DataSource, acesse o post “Criando um DataSource no Tomcat”.

import javax.annotation.Resource;
import javax.servlet.http.HttpServlet;
import javax.sql.DataSource;

/**
 * Servlet exemplo com injeção de recursos (Resource Injection) em propriedade
 * @author Ednei Parmigiani Júnior
 */
public class ResourceInjectionServlet extends HttpServlet {
	private static final long serialVersionUID = -3113417093964521380L;

	@Resource(name="jdbc/MyDataSource")
	private DataSource dataSource;
}

Além da possibilidade de injeção baseada em campo/propriedade, exemplo anterior. Também podemos injetar um recurso usando injeção à base de método:

import javax.annotation.Resource;
import javax.servlet.http.HttpServlet;
import javax.sql.DataSource;

/**
 * Servlet exemplo com injeção de recursos (Resource Injection) em método
 * @author Ednei Parmigiani Júnior
 */
public class ResourceInjectionServlet extends HttpServlet {
	private static final long serialVersionUID = -3113417093964521380L;

	private DataSource dataSource;

	@Resource(name="jdbc/MyDataSource")
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}
}

Para usar injeção baseada em método, o método “set” deve seguir as convenções JCP para JavaBeans, que define para nomes de propriedade: O nome do método deve começar com set , ter um void tipo de retorno e apenas um parâmetro.

A seguir uma servlet completa de exemplo para mostrar a funcionalidade da injeção recursos, testada no servlet container Apache Tomcat.

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import org.apache.log4j.Logger;

/**
 * Exemplo de utilização do recurso <code>ResourceInjection</code>
 * @author Ednei Parmigiani Júnior
 */
@WebServlet(value="resourceInjection")
public class ResourceInjectionServlet extends HttpServlet {
	private static final long serialVersionUID = 7870857617725080228L;
	private Logger logger = Logger.getLogger(getClass().getName());

	@Resource(name="jdbc/MyDataSource")
	private DataSource dataSource;

	private Connection connection;

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			connection = dataSource.getConnection();
			logger.info(String.valueOf(connection == null));
		} catch (Exception e) {
			logger.error("erro ao obter a conexao do data source", e);
		} finally {
			if (connection == null) {
				try {
					connection.close();
					logger.info("conexao fechada");
				} catch (SQLException e) {}
			}
		}
	}
}

A anotação @Resource pertence ao pacote “javax.annotation” assim foi evidenciado nos imports dos exemplos. Quando a injeção e executada ela se resolve por nome, portanto não é um tipo seguro pelo fato de que o tipo do objeto de recurso não é conhecido em tempo de compilação, assim pode ocorrer erros em tempo execução se os tipos de objetos e sua referência não coincidem no momento da injeção.

Por enquanto é isso, até o próximo post.

Deixe um comentário

Campos obrigatórios são marcados *

Post Navigation