Struts 2 + AJAX + JPA + Spring – Parte V
Integrando o Spring com Struts 2 + JPA
Bem, como visto ate agora, nossas actions irão utilizar as classes LoginImpl e ContatoImpl para poderem acessar o banco de dados.
Injeção de Dependências
Agora vamos ver como a dependência de nossos objetos serão injetadas pelo Spring.
Nossos serviços de dados terão seus atributos que são referencias a classes daos instanciados pelo spring, logo nossas classes daos terão sua dependência que no caso delas é o EntityManagerFactory que é o objeto que tem carregado todas a informações e meios de acesso ao banco de dados também instanciado pelo spring.
O Spring age como um container que fabrica seus objetos a partir de um arquivo de configuração, embora esta nova versão do spring já possua suporte a annotations este artigo não engloba este tópico, deixaremos para a próxima.
Existem algumas maneiras para realizar a injeção de dependências, neste artigo iremos abordar os dois estilos que são:
Constructor Injection : é quando a injeção da dependência é realizada pelo construtor da classe, utilizando uma referência do objeto a ser passado como abaixo:
<bean id="contatoDao" class="br.jm.persistencia.ContatoDAO">
<constructor-arg ref="entityManagerFactory"></constructor-arg>
</bean>
Aqui nosso construtor da classe ContatoDAO receberá uma referencia ao bean entityManagerFactory.
Setter Injection : é quando o container, no nosso caso o Spring, utiliza do método set da propriedade para realizar a atribuição por valor da propriedade, como no exemplo abaixo:
<bean id="removeContato" class="br.jm.actions.RemoverContatoAction" scope="prototype">
<property name="servico" value="servicoContato"></property>
</bean>
No bean removeContato é atribuído por valor utilizando o método set do atributo servico o valor do bean servicoContato
É com a tag <bean/> que iremos configurar o spring, esta tag é inserida dentro do elemento raiz <beans/> configurado no arquivo applicationContext.xml que deve ser criado dentro do seu diretório nomeProjeto/WebContent/WEB-INF/
Vamos ver primeiramente a classe LoginIml que implementa a interface LoginIF que esta na listagem 16.
package br.jm.servico;
public interface LoginIF {
public Boolean valida(String login, String senha);
}
Listagem 16 – LoginIF.java
Esta interface possui somente um método que retorna um boolean e recebe duas strings, o login e a senha do usuário, agora vamos a ver a sua implementação de acordo com a listagem 17.
package br.jm.servico;
import br.jm.persistencia.LoginDAO;
public class LoginImpl implements LoginIF {
private LoginDAO loginDAO;
public LoginImpl() {
}
public LoginImpl(LoginDAO loginDAO) {
this.loginDAO = loginDAO;
}
public Boolean valida(String login, String senha) {
return this.loginDAO.validaLogin(login, senha);
}
//métodos getters e setters
}
Listagem 17 - LoginImpl
Como a classe LoginImpl possui um atributo loginDAO e este será injetado pelo Spring então temos que declarar um construtor default e um construtor recebendo um LoginDAO caso iremos utilizar uma injeção do tipo constructor injection que é quando se recebe uma referência do objeto no construtor.
Para que não ocorra erros utilizando o spring é necessário que o atributo loginDAO tenha seus métodos getters e setters. Nos iremos configurar o spring para que este instancie e injete qualquer dependências desses objetos.
Agora vamos ver a classe ContatoImpl que implementa a interface ContatoIF como pode ser visto nas listagens 18 e 19.
package br.jm.servico;
import java.util.List;
import br.jm.entidade.Contato;
public interface ContatoIF {
public void salvarContato(Contato contato);
public Contato acharContato(Long id);
public List<Contato> listarContatos();
public void removerContato(Long id);
public void removerContatos();
}
Listagem 18 – ContatoIF.java
package br.jm.servico;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import br.jm.entidade.Contato;
import br.jm.persistencia.ContatoDAO;
public class ContatoImpl implements ContatoIF {
private ContatoDAO contatoDAO;
public ContatoImpl() {
}
public ContatoImpl(ContatoDAO contatoDAO) {
this.contatoDAO = contatoDAO;
}
public Contato acharContato(Long id) {
return contatoDAO.acharContato(id);
}
public List<Contato> listarContatos() {
List<Contato> lista = new ArrayList<Contato>();
List<Contato> lista2 = contatoDAO.obtemListaContato();
if(lista2 != null) {
lista.addAll(lista2);
}
return Collections.unmodifiableList(lista);
}
public void removerContato(Long id) {
contatoDAO.removerContato(id);
}
public void salvarContato(Contato contato) {
contatoDAO.adiciona(contato);
}
public void removerContatos() {
contatoDAO.removeContatos();
}
Listagem 19 – ContatoImpl.java