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

Leia todos os artigos da série