Commit 3326f45f by Patryk Czarnik

Wydzielenie interfejsu LogikaKalkulatora i wstrzykiwanie przez interfejs

parent 64291d6b
...@@ -10,6 +10,9 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -10,6 +10,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
@Controller @Controller
@RequestMapping("/kalkulator") @RequestMapping("/kalkulator")
public class Kalkulator { public class Kalkulator {
// @Autowired powoduje, że Spring sam wpisze tutaj referencję do obiektu (do "komponentu" / "beana" zarejestrowanego w tej aplikacji)
// Nawet, gdy zmienna jest typu interfejs, a istnieje komponent, który implementuje ten interfejs,
// to Spring znajdzie ten komponent i go użyje.
@Autowired @Autowired
private LogikaKalkulatora logikaKalkulatora; private LogikaKalkulatora logikaKalkulatora;
......
package com.example.demo; package com.example.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import org.springframework.stereotype.Component; public interface LogikaKalkulatora {
/* Wstrzykiwaie zależności (dependency injection): long oblicz(String operacja, long liczba1, long liczba2);
* - gdy przed klasą napiszemy adnotację @Component (albo: @Service, @Repository, @Controller, ...)
* to na starcie aplikacji Spring utworzy jeden obiekt tej klasy ("singleton") i będzie go pamiętać
* (ten obiekt będzie "beanem")
* - są też inne sposoby tworzenie beanów (konfiguracja w pliku beans.xml, adnotacje @Bean przy metodzie fabrycznej, ...)
*
* - gdy w innej klasie przy polu danego typu uzyjemy adnotacji @Autowired, to Spring wpisze tam referencję do znaego sobie obiektu danej klasy
* - są też inne sposoby wstrzykiwania: poprzez setter i poprzez konstruktor.
*/
@Component List<String> getHistoriaDzialan();
public class LogikaKalkulatora {
// Ponieważ ten sam obiekt listy będzie używany w różnych zapytaniach, to może być używany przez różne wątki.
// dlatego tworzymy listę "synchronizowaną", żeby np. równoległe operacje add sobie nie przeszkadzały.
private final List<String> historiaDzialan = Collections.synchronizedList(new ArrayList<>());
public long oblicz(String operacja, long liczba1, long liczba2) {
long wynik = switch(operacja) {
case "+" -> liczba1 + liczba2;
case "-" -> liczba1 - liczba2;
case "*" -> liczba1 * liczba2;
case "/" -> liczba1 / liczba2;
case "%" -> liczba1 % liczba2;
default -> 0;
};
historiaDzialan.add(String.format("%d %s %d = %s", liczba1, operacja, liczba2, wynik));
return wynik;
}
public List<String> getHistoriaDzialan() {
return Collections.unmodifiableList(historiaDzialan);
// dla zwiększenia bezpieczeństwa wątkowego, można by też zwrócić kopię
}
} }
\ No newline at end of file
package com.example.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.stereotype.Component;
/* Wstrzykiwaie zależności (dependency injection):
* - gdy przed klasą napiszemy adnotację @Component (albo: @Service, @Repository, @Controller, ...)
* to na starcie aplikacji Spring utworzy jeden obiekt tej klasy ("singleton") i będzie go pamiętać
* (ten obiekt będzie "beanem")
* - są też inne sposoby tworzenie beanów (konfiguracja w pliku beans.xml, adnotacje @Bean przy metodzie fabrycznej, ...)
*
* - gdy w innej klasie przy polu danego typu użyjemy adnotacji @Autowired, to Spring wpisze tam referencję do znaego sobie obiektu danej klasy
* - są też inne sposoby wstrzykiwania: poprzez setter i poprzez konstruktor.
*/
@Component
public class LogikaKalkulatoraImpl implements LogikaKalkulatora {
// Ponieważ ten sam obiekt listy będzie używany w różnych zapytaniach, to może być używany przez różne wątki.
// dlatego tworzymy listę "synchronizowaną", żeby np. równoległe operacje add sobie nie przeszkadzały.
private final List<String> historiaDzialan = Collections.synchronizedList(new ArrayList<>());
@Override
public long oblicz(String operacja, long liczba1, long liczba2) {
long wynik = switch(operacja) {
case "+" -> liczba1 + liczba2;
case "-" -> liczba1 - liczba2;
case "*" -> liczba1 * liczba2;
case "/" -> liczba1 / liczba2;
case "%" -> liczba1 % liczba2;
default -> 0;
};
historiaDzialan.add(String.format("%d %s %d = %s", liczba1, operacja, liczba2, wynik));
return wynik;
}
@Override
public List<String> getHistoriaDzialan() {
return Collections.unmodifiableList(historiaDzialan);
// dla zwiększenia bezpieczeństwa wątkowego, można by też zwrócić kopię
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment