Woche 1, Tag 1 — Welches Problem löst Spring?
Ziel
Heute baust du das grundlegende Bild von Spring auf.
Die Kernfragen:
- Welches Problem löst Spring?
- Was ist IoC?
- Was ist Dependency Injection?
- Was ist eine Spring Bean?
- Was ist
ApplicationContext? - Was ist der Unterschied zwischen Spring Framework und Spring Boot?
1. Welches Problem löst Spring?
In normalem Java-Code erzeugen Klassen ihre Abhängigkeiten oft selbst:
public class OrderService {
private final OrderRepository orderRepository;
public OrderService() {
this.orderRepository = new OrderRepository();
}
}
Das funktioniert — erzeugt aber Probleme.
Was schiefgeht
OrderServicehängt fest anOrderRepository— enge Kopplung.- Schwer testbar.
- Schwer austauschbar (andere Implementierung).
- In großen Apps wird die Objekterzeugung unübersichtlich.
- Die Klasse übernimmt zu viel Verantwortung.
Spring übernimmt Erzeugung und Verdrahtung der Objekte.
2. Was ist IoC?
IoC = Inversion of Control (Umkehrung der Steuerung).
Ohne Spring:
Mein Code erzeugt Objekte.
Mit Spring:
Spring erzeugt Objekte.
Kurz:
Die Steuerung über Objekterzeugung und Abhängigkeiten liegt beim Spring-Container — nicht mehr im Anwendungscode.
Merksatz:
IoC heißt: Spring erzeugt und verwaltet Objekte für dich.
3. Was ist Dependency Injection?
Eine Klasse bekommt Abhängigkeiten von außen — statt sie selbst mit new zu bauen.
Schlecht:
public class OrderService {
private final OrderRepository orderRepository;
public OrderService() {
this.orderRepository = new OrderRepository();
}
}
Besser:
public class OrderService {
private final OrderRepository orderRepository;
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
}
OrderService erzeugt OrderRepository nicht mehr selbst. Es bekommt es injiziert — das ist Dependency Injection.
4. IoC vs. Dependency Injection
Zusammenhang, aber nicht dasselbe.
IoC
Das übergeordnete Prinzip: Das Framework steuert Erzeugung und Verwaltung von Objekten.
Dependency Injection
Eine konkrete Technik für IoC: Abhängigkeiten kommen von außen.
Merksatz:
IoC ist die Idee. Dependency Injection ist die Technik.
5. Was ist eine Spring Bean?
Eine Bean ist ein von Spring verwaltetes Objekt.
@Service
public class OrderService {
}
Wenn Spring dieses Objekt erzeugt und verwaltet, ist es eine Bean.
Das ist keine Bean:
OrderService orderService = new OrderService();
Mit new erzeugt — Spring verwaltet es nicht automatisch.
Prüfungsdefinition:
Eine Spring Bean ist ein Objekt, dessen Lebenszyklus vom Spring IoC-Container verwaltet wird.
6. Was heißt „von Spring verwaltet“?
Spring kann:
- das Objekt erzeugen
- Abhängigkeiten injizieren
- es konfigurieren
- Lifecycle-Methoden aufrufen
- Proxies drumherum legen
- es beim Shutdown zerstören
@Service
public class OrderService {
private final OrderRepository orderRepository;
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
}
Spring erzeugt OrderService und injiziert OrderRepository.
7. Was ist ApplicationContext?
Der zentrale Spring-Container. Er verwaltet alle Beans.
Er „weiß“ im Prinzip:
Es gibt eine OrderService-Bean.
Es gibt eine OrderRepository-Bean.
OrderService braucht OrderRepository.
Ich verbinde die beiden.
Kurz:
ApplicationContexterzeugt, verdrahtet, konfiguriert und verwaltet Beans.
8. Zwei Wege, Beans zu registrieren
Weg 1 — Annotation auf der Klasse
@Component
@Service
@Repository
@Controller
@RestController
@Service
public class OrderService {
}
Spring findet die Klasse per Component Scanning.
Weg 2 — @Bean-Methode
@Configuration
public class AppConfig {
@Bean
public Clock clock() {
return Clock.systemUTC();
}
}
@Bean, wenn:
- die Klasse aus einer Drittanbieter-Lib kommt
- du keine
@Componentsetzen kannst - die Erzeugung eigene Logik braucht
9. Was passiert beim Spring-Boot-Start?
Vereinfachter Ablauf:
1. main() läuft
2. SpringApplication.run(...) startet
3. ApplicationContext wird erstellt
4. Spring scannt Packages
5. Bean-Definitionen werden registriert
6. Beans werden erzeugt
7. Abhängigkeiten werden injiziert
8. Lifecycle-Callbacks laufen
9. Embedded Webserver startet (bei Web-Apps)
10. App ist bereit
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
10. Spring Framework vs. Spring Boot
Spring Framework
Das Fundament:
- IoC-Container
- Dependency Injection
- AOP
- Transaktionen
- MVC
- Datenzugriff
Spring Boot
Macht Spring schneller start- und betriebsfähig:
- Auto-Konfiguration
- Starter-Dependencies
- Embedded Tomcat
- einfachere Konfiguration
- Actuator
- sinnvolle Defaults
Merksatz:
Spring ist das Fundament. Boot macht den Einstieg und Betrieb einfacher.
Übungsfragen
Frage 1
Was ist das Problem hier?
public class OrderService {
private final OrderRepository orderRepository;
public OrderService() {
this.orderRepository = new OrderRepository();
}
}
Antwort:
OrderService erzeugt OrderRepository selbst. Enge Kopplung an eine konkrete Implementierung — schwer testbar, schwer austauschbar, Spring kann die Abhängigkeit nicht sinnvoll übernehmen.
Frage 2
Warum ist das besser?
public class OrderService {
private final OrderRepository orderRepository;
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
}
Antwort:
Die Abhängigkeit kommt von außen und ist explizit. In Produktion ein echtes Repository, in Tests ein Mock — Dependency Injection.
Frage 3
Unterschied IoC und Dependency Injection?
Antwort:
IoC: Steuerung wechselt vom eigenen Code zum Container/Framework. Dependency Injection: Dependencies werden von außen geliefert — in Spring der Hauptweg für IoC.
Frage 4
Wird das automatisch von Spring verwaltet?
UserService userService = new UserService();
Antwort:
Nein. new = Spring verwaltet es nicht. Bean werden z. B. über @Component, @Service oder @Bean.
Frage 5
Was ist eine Spring Bean?
Antwort:
Ein vom IoC-Container erzeugtes und verwaltetes Objekt. Spring injiziert Dependencies, steuert den Lebenszyklus und kann Proxies für Transaktionen, Security usw. legen.
Merksätze zum Mitnehmen
- IoC: Spring steuert die Objekterzeugung.
- Dependency Injection: Abhängigkeiten kommen von außen.
- IoC = Idee, DI = Technik.
- Bean = vom Container verwaltetes Objekt.
ApplicationContext= der Hauptcontainer.- Framework = Kern. Boot = Komfort und Defaults drumherum.