6. Spring para configurar aplicações de três camadas
Aqui, vamos usar um exemplo para explorar como o Spring pode ser usado para configurar aplicações de três camadas. Um exemplo comum deste tipo de aplicação são as aplicações web.
6.1. O Problema
Queremos 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á gerida pelo Spring
- Criaremos pacotes separados para cada uma das três camadas, aos quais daremos os nomes [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 irá implementar a seguinte interface:
Namespace istia.st.spring3tier.dao
Public Interface IDao
' do something in the diaper [dao]
Function doSomethingInDaoLayer(ByVal a As Integer, ByVal b As Integer) As Integer
End Interface
End Namespace
- Escreva 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.
- Escreva uma classe de teste NUnit para testar as duas classes anteriores
6.3. A camada de negócios
A camada de negócios irá implementar a seguinte interface:
Namespace istia.st.spring3tier.domain
Public Interface IDomain
' do something in the [domain] layer
Function doSomethingInDomainLayer(ByVal a As Integer, ByVal b As Integer) As Integer
End Interface
End Namespace
- Escreva duas classes, Domain1Impl1 e Domain1Impl2, que implementem a interface IDomain. Estas classes terão um campo privado do tipo IDao que pode ser inicializado através de uma propriedade pública. O método doSomethingInDomainLayer da classe [DomainImpl1] incrementará a e b em um, passando depois estes dois parâmetros para o método doSomethingInDaoLayer do objeto IDao1 recebido. O método doSomethingInDomainLayer da classe [Domain1Impl2] decrementará a e b em um antes de fazer o mesmo.
- Escreva 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 irá implementar a seguinte interface:
Namespace istia.st.spring3tier.control
Public Interface IControl
' do something in the [control] layer
Function doSomethingInControlLayer(ByVal a As Integer, ByVal b As Integer) As Integer
End Interface
End Namespace
- Escreva duas classes, Control1Impl1 e Control1Impl2, que implementem a interface IControl1. Estas classes terão um campo privado do tipo IDomain que pode ser inicializado através de uma propriedade pública. O método doSomethingInControlLayer da classe [Control1Impl1] incrementará a e b em um, passando depois estes dois parâmetros para o método doSomethingInDomainLayer do objeto IDomain1 recebido. O método doSomethingInControlLayer da classe [Control1Impl2], por outro lado, decrementará a e b em um antes de fazer o mesmo.
- Escreva uma classe de teste NUnit para testar as duas classes anteriores
6.5. Integração com o Spring
- Escreva um ficheiro de configuração Spring que determinará quais as classes que cada uma das três camadas anteriores deve utilizar
- Escreva uma classe de teste NUnit utilizando diferentes configurações Spring para destacar a flexibilidade da aplicação
- Escreva uma aplicação autónoma (método main) que passe dois parâmetros para o método [doSomethingInControlLayer] da interface IControl implementada e exiba o resultado devolvido pela interface.
