Skip to content

6. Spring para configurar aplicações de três camadas

Propomos aqui estudar, através de um exemplo, como o Spring pode ser utilizado para configurar aplicações de três camadas. Um exemplo comum deste tipo de aplicações são as aplicações web.

6.1. O problema

Pretendemos construir uma aplicação de três camadas com a seguinte estrutura:

  • as três camadas serão tornadas independentes através da utilização de interfaces
  • a integração das três camadas será realizada pelo Spring
  • Serão criados pacotes separados para cada uma das três camadas, que se chamarão [control], [domain] e [dao]. Um pacote adicional, [tests], conterá as aplicações de teste.

6.2. A camada de acesso aos dados

A camada DAO implementará a seguinte interface:

Namespace istia.st.spring3tier.dao
    Public Interface IDao
         ' fazer algo na camada [dao]
        Function doSomethingInDaoLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • Escrever duas classes, Dao1Impl1 e Dao1Impl2, que implementem a interface IDao. O método Dao1Impl1. doSomethingInDaoLayer irá devolver a+b e o método Dao1Impl2. doSomethingInDaoLayer irá devolver a-b.
  • Escrever uma classe de teste NUnit para testar as duas classes anteriores

6.3. A camada de negócio

A camada de negócio implementará a seguinte interface:

Namespace istia.st.spring3tier.domain
    Public Interface IDomain
         ' fazer algo na camada [domain]
        Function doSomethingInDomainLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • Escrever duas classes, Domain1Impl1 e Domain1Impl2, que implementem a interface IDomain. Estas classes terão um campo privado do tipo IDao, que poderá ser inicializado através de uma propriedade pública. O método doSomethingInDomainLayer da classe [DomainImpl1] incrementará a e b em uma unidade e, em seguida, passará esses dois parâmetros para o método doSomethingInDaoLayer do objeto do tipo IDao1 recebido. O método doSomethingInDomainLayer da classe [Domain1Impl2elle] irá decrementar a e b em uma unidade antes de fazer o mesmo.
  • Escrever uma classe de teste NUnit para testar as duas classes anteriores

6.4. A camada de interface do utilizador

A camada de interface do utilizador implementará a seguinte interface:

Namespace istia.st.spring3tier.control
    Public Interface IControl
         ' fazer algo na camada [control]
        Function doSomethingInControlLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • Escrever duas classes, Control1Impl1 e Control1Impl2, que implementem a interface IContro1. Estas classes terão um campo privado do tipo IDomain, que poderá ser inicializado através de uma propriedade pública. O método doSomethingInControlLayer da classe [Control1Impl1] incrementará a e b em uma unidade e, em seguida, passará esses dois parâmetros para o método doSomethingInDomainLayer do objeto do tipo IDomain1 recebido. O método doSomethingInControlLayer da classe [Control11Impl2], por sua vez, diminuirá a e b em uma unidade antes de fazer o mesmo.
  • Escrever uma classe de teste NUnit para testar as duas classes anteriores

6.5. Integração com o Spring

  • Escrever um ficheiro de configuração do Spring que determinará quais as classes que cada uma das três camadas anteriores deverá utilizar
  • Escrever uma classe de teste NUnit utilizando diferentes configurações do Spring, de modo a destacar a flexibilidade da aplicação criada
  • Escrever uma aplicação autónoma (método main) que passe dois parâmetros ao método [doSomethingInControlLayer] da interface IControl implementada e que exiba o resultado gerado pela interface.