Trafiłem na projekt w Springu gdzie sam projekt skadaa się projektu frontem i projektu backend ten backend jest podzielony na moduły jak frontend i backend i każdy z nich ma pod moduły. np frontent znajdują się klasy controller a w module backend serwisy, dto itp.
I teraz aby w controller wywołać metodę z jakiegoś serwisu musze utworzyć w między nimi w kilku warstwach klas i interfejsów ta metodę ( takie połączenie ). Wie ktoś w jakim jest to celu ?
Pytanie odnośnie schematu projektu
- Rejestracja: dni
- Ostatnio: dni
- Postów: 163
- Rejestracja: dni
- Ostatnio: dni
- Postów: 646
Szukaj odpowiedzi pod poniższymi hasłami:
- layer architecture -> https://www.baeldung.com/cs/layered-architecture
- hexagona larchitecture -> https://reflectoring.io/spring-hexagonal/
- package per feature -> https://medium.com/sahibinden-technology/package-by-layer-vs-package-by-feature-7e89cde2ae3a
Samo pakietowanie ma za zadanie min. ustrukturyzować kod i wprowadzić porządek czy np. odseparować logikę biznesową od szczegółów technicznej implementacji. Często za pomocą np. archunit dodaje się do projektu testy weryfikujące kierunek zależności pakietów by do domeny nie wrzucać zewnętrznych zależności w postaci np. dostępu do bazy danych.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Stacktrace
- Postów: 6822

Popatrzmy na taki prosty UML. Controller, który ma pewną specyfikację ControllerSpec, używa, ma pole, typu IService, które reprezentuje pewien interfejs. Interfejs ten jest implementowany przez klasę ServiceImpl.
I teraz mamy kilka możliwości implementacji takiego kodu.
Metoda ręczna
Tworzymy sobie obiekty i samodzielnie je łączymy:
package net.programmers.frontend;
public interface ControllerSpec{
// jakieś tam metody
}
public class Controller implemnts ControllerSpec{
private final IService service;
public Controller(IService service){
this.service = service;
}
// i potem w jakiejś metodzie
public Response get(Request req){
//…
service.doSomething();
//…
}
}
package net.programmers.backend;
public interface IService{
// jakieś tam metody
}
public class ServiceImpl implements IService{
// jakieś tam metody
}
package net.programmers.main;
public class App{
public static void main(String[] args){
IService service = new ServiceImpl();
ControllerSpec controller = new Controller(service);
// i dalej coś robimy z naszym kontrolerem
}
}
To jest akurat trochę bez sensu, bo masz dużo ręcznej roboty i musisz samodzielnie zarządzać obiektami. W dodatku, żeby sobie nie komplikować życia, wszystko jest publiczne.
Dlatego można użyć mechanizmów wstrzykiwania zależności
Kontener DI
Tutaj podam przykład z adnotacjami Springa, ale podobnie będzie w Guice i JEE
package net.programmers.frontend;
public interface ControllerSpec{
// jakieś tam metody
}
@Controller
class Controller implemnts ControllerSpec{
private final IService service;
@Autowire
public Controller(IService service){
this.service = service;
}
// i potem w jakiejś metodzie
public Response get(Request req){
//…
service.doSomething();
//…
}
}
package net.programmers.backend;
public interface IService{
// jakieś tam metody
}
@Service
class ServiceImpl implements IService{
// jakieś tam metody
}
package net.programmers.main;
public class App{
public static void main(String[] args) {
SpringApplication app = new SpringApplication(App.class);
app.run(args);
}
}
W tym przypadku za łączenie obiektów odpowiada kontener DI. Dokładny opis jak to jest zrobione znajdziesz w dokumentacji i kodzie springa.