Skip to content

6. Spring do konfiguracji aplikacji trójwarstwowych

W niniejszym artykule zamierzamy na przykładzie przeanalizować, w jaki sposób Spring może być wykorzystywany do konfiguracji aplikacji trójwarstwowych. Typowym przykładem tego rodzaju aplikacji są aplikacje internetowe.

6.1. Problem

Chcemy zbudować aplikację trójwarstwową o następującej strukturze:

  • trzy warstwy zostaną oddzielone dzięki zastosowaniu interfejsów
  • integracja trzech warstw zostanie zrealizowana przez Spring
  • dla każdej z trzech warstw utworzymy oddzielne pakiety o nazwach [control], [domain] i [dao]. Dodatkowy pakiet [tests] będzie zawierał aplikacje testowe.

6.2. Warstwa dostępu do danych

Warstwa DAO będzie implementować następujący interfejs:

Namespace istia.st.spring3tier.dao
    Public Interface IDao
         ' wykonanie jakiejś czynności w warstwie [dao]
        Function doSomethingInDaoLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • Należy napisać dwie klasy Dao1Impl1 i Dao1Impl2 implementujące interfejs IDao. Metoda Dao1Impl1.doSomethingInDaoLayer zwróci a+b, a metoda Dao1Impl2.doSomethingInDaoLayer zwróci a-b.
  • Napisz klasę testową NUnit, która przetestuje dwie poprzednie klasy

6.3. Warstwa biznesowa

Warstwa biznesowa będzie implementować następujący interfejs:

Namespace istia.st.spring3tier.domain
    Public Interface IDomain
         ' wykonanie jakiejś czynności w warstwie [domain]
        Function doSomethingInDomainLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • Należy napisać dwie klasy Domain1Impl1 i Domain1Impl2 implementujące interfejs IDomain. Klasy te będą miały pole prywatne typu IDao, które będzie można zainicjować za pomocą właściwości publicznej. Metoda doSomethingInDomainLayer klasy [DomainImpl1] zwiększy wartości a i b o jedność, a następnie przekaże te dwa parametry do metody doSomethingInDaoLayer otrzymanego obiektu typu IDao1. Metoda doSomethingInDomainLayer klasy [Domain1Impl2elle] zmniejszy wartości a i b o jedną jednostkę, a następnie wykona tę samą operację.
  • napisać klasę testową NUnit sprawdzającą obie poprzednie klasy

6.4. Warstwa interfejsu użytkownika

Warstwa interfejsu użytkownika zaimplementuje następujący interfejs:

Namespace istia.st.spring3tier.control
    Public Interface IControl
         ' wykonać jakąś czynność w warstwie [control]
        Function doSomethingInControlLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • Należy napisać dwie klasy Control1Impl1 i Control1Impl2 implementujące interfejs IContro1. Klasy te będą miały pole prywatne typu IDomain, które będzie można zainicjować za pomocą właściwości publicznej. Metoda doSomethingInControlLayer klasy [Control1Impl1] zwiększy wartości a i b o jedność, a następnie przekaże te dwa parametry do metody doSomethingInDomainLayer otrzymanego obiektu typu IDomain1. Z kolei metoda doSomethingInControlLayer klasy [Control11Impl2] zmniejszy wartości a i b o jedną jednostkę, a następnie wykona tę samą operację.
  • napisać klasę testową NUnit sprawdzającą obie poprzednie klasy

6.5. Integracja ze Springiem

  • Napisz plik konfiguracyjny Springa, który określi, z jakich klas będzie korzystać każda z trzech poprzednich warstw
  • napisz klasę testową NUnit wykorzystującą różne konfiguracje Springa, aby podkreślić elastyczność napisanej aplikacji
  • napisz samodzielną aplikację (metoda main), przekazującą dwa parametry do metody [doSomethingInControlLayer] w zaimplementowanym interfejsie IControl i wyświetlającą wynik zwrócony przez interfejs.