Mock Full 01 — Spring Professional (60 Fragen)
Prüfungsstil: Spring Professional Develop (2V0-72.22) — vollständiger 60-Fragen-Mock aus gemischten Themen.
Zeitlimit: ca. 130 Minuten (etwa 2 Minuten pro Frage).
Anleitung:
- Wähle pro Frage eine Option und nutze dann Antwort prüfen, um Erklärung und Punktestand zu sehen.
- Mit Zurück und Weiter durch das Set navigieren; deine Auswahl kannst du ändern, bis du prüfst.
- Bei jedem Fehler die Erklärung lesen und einen Merksatz notieren, bevor du weitermachst.
Themenverteilung:
- F1–10: Spring Core & DI
- F11–18: Konfiguration, Profile & Scopes
- F19–28: Spring Boot, Auto-Configuration & Actuator
- F29–36: Spring MVC, REST & Validierung
- F37–44: Datenzugriff, JPA & Transaktionen
- F45–50: Spring Security
- F51–56: Testing
- F57–60: AOP, Events, Async & Observability
Frage 1
Ein Legacy-Monolith wird auf Spring migriert. Das Team will lose Kopplung zwischen Services, stößt aber immer wieder auf NullPointerException, wenn Collaborators nicht verdrahtet sind.
Welcher Spring-Mechanismus adressiert direkt das Problem, dass Objekte ihre eigenen Abhängigkeiten erzeugen und fehlschlagen, wenn Collaborators fehlen?
- A) Nur Component Scanning
- B) Bean-Lifecycle-Callbacks
- C) Dependency Injection über den IoC-Container
- D) Property-Placeholder-Auflösung
Antwort & Erklärung
Richtige Antwort: C
Dependency Injection (DI) ist das zentrale IoC-Muster, bei dem der Container Collaborators bereitstellt, statt dass Klassen new oder statische Lookups nutzen. Das löst enge Kopplung und stellt sicher, dass erforderliche Abhängigkeiten bei der Erstellung geliefert werden — genau das verhindert ad-hoc-null-Collaborators in einer Spring-Anwendung.
Warum die anderen Optionen falsch sind:
- A) Component Scanning findet Beans, injiziert aber nicht von sich aus Abhängigkeiten in beliebige Objekte.
- B) Lifecycle-Callbacks laufen, nachdem ein Bean existiert; sie ersetzen nicht die Verdrahtung von Abhängigkeiten.
- D) Property-Placeholders injizieren Konfigurationswerte, keine beliebigen Objekt-Collaborators.
Merksatz: „DI heißt: Der Container verdrahtet Collaborators; Objekte erzeugen ihre Abhängigkeiten nicht mit new."
Weiterlernen: Buchkapitel
Frage 2
Beim Startup-Debugging vergleicht ein Entwickler das Verhalten von BeanFactory und ApplicationContext in einer Web-Anwendung.
Welche Aussage über ApplicationContext im Vergleich zu BeanFactory ist korrekt?
@Configuration
public class AppConfig {
@Bean
public PaymentService paymentService() {
return new PaymentService();
}
}
- A) BeanFactory initialisiert alle Singleton-Beans beim Refresh eager, ApplicationContext ist lazy
- B) Nur BeanFactory unterstützt die Verarbeitung von @Configuration-Klassen
- C) ApplicationContext kann keine Bean-Definitionen aus Java-Konfiguration laden
- D) ApplicationContext ist eine Obermenge mit Enterprise-Features wie Event-Publikation und Internationalisierung
Antwort & Erklärung
Richtige Antwort: D
ApplicationContext erweitert BeanFactory und fügt höherwertige Container-Fähigkeiten hinzu — unter anderem Application-Event-Propagation, MessageSource-Zugriff, Resource-Loading-Muster und automatische BeanPostProcessor-Registrierung. BeanFactory ist der minimale Vertrag; ApplicationContext nutzt Spring Boot in der Praxis.
Warum die anderen Optionen falsch sind:
- A) Es ist eher umgekehrt: ApplicationContext erzeugt Singletons standardmäßig eager beim Refresh.
- B) @Configuration-Verarbeitung übernehmen Configuration-Class-Post-Processor, die im ApplicationContext registriert sind.
- C) ApplicationContext unterstützt @Configuration und @Bean-Definitionen vollständig.
Merksatz: „ApplicationContext = BeanFactory plus Events, i18n und reichere Startup-Integration."
Weiterlernen: Buchkapitel
Frage 3
Eine Bean-Definition gibt die Klasse com.example.ReportService und den Scope singleton an. Zwei verschiedene @Autowired-Felder in derselben Anwendung erhalten beide einen ReportService. Was ist garantiert?
@Service
public class ReportService { }
@Autowired ReportService a;
@Autowired ReportService b; // dieselbe Instanz wie a
- A) Jeder Injection Point erhält eine eigene Instanz, weil die Felder getrennt sind
- B) Pro Injection Point wird eine neue Instanz erzeugt
- C) Prototype-Scope gilt implizit, sobald @Autowired verwendet wird
- D) Beide Injection Points erhalten dieselbe Singleton-Instanz, die der Container verwaltet
Antwort & Erklärung
Richtige Antwort: D
Standard-Singleton-Scope bedeutet eine gemeinsame Instanz pro Bean-Definition im Container. Jeder Injection Point, der auf diesen Bean-Namen/-Typ verweist, erhält dieselbe Objektreferenz — außer es wird ein explizit engerer Scope oder Provider-Indirektion genutzt.
Warum die anderen Optionen falsch sind:
- A) Getrennte Felder bedeuten unter Singleton-Scope keine getrennten Bean-Instanzen.
- B) Singleton-Beans werden nicht pro Injection Site erzeugt.
- C) @Autowired ändert den Scope nicht; der Scope kommt aus der Bean-Definition.
Merksatz: „Singleton = eine container-verwaltete Instanz, die alle Injection Points teilen."
Weiterlernen: Buchkapitel
Frage 4
Der Konstruktor von OrderService benötigt ein PaymentGateway. Das Team fügt @Autowired am Konstruktor hinzu, nachdem ein zweiter Konstruktor fürs Testen eingeführt wurde.
Was passiert, wenn OrderService zwei Konstruktoren hat und nur einer mit @Autowired annotiert ist?
@Service
public class OrderService {
private final PaymentGateway gateway;
public OrderService(PaymentGateway gateway) {
this.gateway = gateway;
}
public OrderService() {
this.gateway = null;
}
}
- A) Spring wählt immer den No-Arg-Konstruktor
- B) Spring nutzt den @Autowired-Konstruktor für Dependency Injection
- C) Spring bricht den Startup ab, weil mehrere Konstruktoren nicht erlaubt sind
- D) Spring injiziert stattdessen in Felder, wenn mehrere Konstruktoren existieren
Antwort & Erklärung
Richtige Antwort: B
Bei mehreren Konstruktoren kann Spring 4.3+ einen einzelnen Konstruktor ohne Annotation autowiren, wenn er der einzige ist — gibt es mehr als einen, musst du den gewünschten mit @Autowired markieren (oder in älteren Versionen @Required nutzen). Der annotierte Konstruktor wird zum Injection Target.
Warum die anderen Optionen falsch sind:
- A) Bei mehreren Konstruktoren defaultet Spring nicht auf No-Arg, außer er ist der einzige autowirable Kandidat.
- C) Mehrere Konstruktoren sind erlaubt, wenn der gewünschte explizit ausgewählt wird.
- D) Konstruktor-Ambiguität wird durch Konstruktor-Auswahl gelöst, nicht durch automatische Feld-Injection.
Merksatz: „Mehrere Konstruktoren: Den Injection-Konstruktor mit @Autowired markieren."
Weiterlernen: Buchkapitel
Frage 5
Welcher Injection-Stil ist in Spring allgemein bevorzugt für erforderliche, unveränderliche Abhängigkeiten und gute Testbarkeit?
@Service
public class InvoiceService {
private final TaxService taxService;
public InvoiceService(TaxService taxService) {
this.taxService = taxService;
}
}
- A) Feld-Injection mit @Autowired
- B) Nur Setter-Injection
- C) Konstruktor-Injection
- D) Statischer Factory-Lookup aus ApplicationContextHolder
Antwort & Erklärung
Richtige Antwort: C
Konstruktor-Injection macht Abhängigkeiten explizit, ermöglicht unveränderliche Felder, vereinfacht Unit-Tests ohne Spring und vermeidet versteckte Feld-Abhängigkeiten. Spring-Dokumentation und Prüfungsmaterial behandeln Konstruktor-Injection durchgängig als bevorzugten Stil für erforderliche Collaborators.
Warum die anderen Optionen falsch sind:
- A) Feld-Injection verbirgt Abhängigkeiten und erschwert Tests.
- B) Setter-Injection ist für optionale Abhängigkeiten sinnvoll, aber nicht die allgemeine Best Practice für erforderliche.
- D) Statische Context-Lookups sind ein Anti-Pattern mit enger Framework-Kopplung.
Merksatz: „Konstruktor-Injection bevorzugen für erforderliche, unveränderliche Collaborators."
Weiterlernen: Buchkapitel
Frage 6
Ein Bibliotheksmodul unter com.vendor.integration wird hinzugefügt, aber Beans in diesem Package werden zur Laufzeit nicht erzeugt.
Die Hauptanwendungsklasse liegt in com.example.app und nutzt @SpringBootApplication. Beans in com.vendor.integration sind mit @Component annotiert, registrieren sich aber nie. Was ist die wahrscheinlichste Ursache?
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- A) Component Scanning startet im Package der @SpringBootApplication-Klasse und schließt
com.vendor.integrationstandardmäßig nicht ein - B) @Component kann außerhalb des Hauptanwendungs-Packages nicht verwendet werden
- C) Spring Boot deaktiviert Scanning, außer
spring.scan.enabled=true - D) Nur @Bean-Methoden können Beans außerhalb des Haupt-Packages registrieren
Antwort & Erklärung
Richtige Antwort: A
@SpringBootApplication kombiniert @Configuration, @EnableAutoConfiguration und @ComponentScan mit Standard-Basis-Package gleich dem Package der deklarierenden Klasse. Klassen außerhalb dieses Package-Baums werden nicht gescannt, außer du ergänzt @ComponentScan basePackages oder nutzt @Import.
Warum die anderen Optionen falsch sind:
- B) @Component funktioniert in jedem gescannten Package.
- C) Es gibt keinen Standard-Schalter
spring.scan.enabled; Scanning ist über @SpringBootApplication standardmäßig aktiv. - D) @Component Scanning ist der normale Weg, Beans außerhalb des Haupt-Packages zu registrieren, wenn die Scan-Pfade sie einschließen.
Merksatz: „@SpringBootApplication scannt nur sein eigenes Package und Unterpackages — außer du erweiterst @ComponentScan."
Weiterlernen: Buchkapitel
Frage 7
Was bewirkt @Primary auf einem Bean vom Typ NotificationSender, wenn mehrere NotificationSender-Beans existieren?
@Bean @Primary
public NotificationSender emailSender() { return new EmailSender(); }
@Bean
public NotificationSender smsSender() { return new SmsSender(); }
- A) Es markiert den Bean als einzige erlaubte Implementierung und deaktiviert andere
- B) Es gibt dem Bean höhere @Order für AOP-Advice
- C) Es ändert den Bean-Scope auf Singleton
- D) Es macht diesen Bean zum bevorzugten Kandidaten beim Autowiring nach Typ ohne @Qualifier
Antwort & Erklärung
Richtige Antwort: D
@Primary löst Ambiguität, wenn mehrere Beans zu einem Injection-Point-Typ passen. Ohne @Qualifier wird der Primary Bean gewählt. Andere Beans bleiben gültig und können weiterhin mit @Qualifier oder @Resource-Name injiziert werden.
Warum die anderen Optionen falsch sind:
- A) @Primary deaktiviert andere Beans nicht.
- B) @Order betrifft geordnete Listen und manche Infrastruktur-Reihenfolge, nicht @Primary-Auswahl.
- C) @Primary ändert den Scope nicht.
Merksatz: „@Primary bricht Typ-Ambiguität; @Qualifier wählt explizit einen bestimmten Bean."
Weiterlernen: Buchkapitel
Frage 8
Ein Reporting-Modul braucht die neueste ExchangeRateService-Implementierung, aber zwei Beans implementieren das Interface.
Ein Feld ist als @Autowired ExchangeRateService service deklariert. Es existieren zwei Beans: exchangeRateServiceLegacy und exchangeRateServiceV2. Wie injizierst du explizit exchangeRateServiceV2?
- A) @Lazy am Feld hinzufügen
- B) @Qualifier("exchangeRateServiceV2") oder gleichwertigen Bean-Namen-Qualifier nutzen
- C)
exchangeRateServiceV2mit @Controller markieren - D) @Autowired entfernen und in @PostConstruct manuell getBean aufrufen
Antwort & Erklärung
Richtige Antwort: B
Wenn mehrere Beans zu einem Typ passen, wählt @Qualifier (oder @Resource mit Name) den gewünschten Bean nach Name oder Custom-Qualifier-Annotation. Das ist die idiomatische Spring-Lösung für explizite Disambiguierung.
Warum die anderen Optionen falsch sind:
- A) @Lazy verzögert nur die Initialisierung; es wählt nicht zwischen Kandidaten.
- C) Stereotype-Annotationen lösen Injection-Ambiguität nicht von selbst.
- D) Manuelles getBean funktioniert, ist aber nicht der deklarative Injection-Ansatz, den die Prüfung erwartet.
Merksatz: „Mehrere Beans eines Typs: @Qualifier oder @Primary nutzen."
Weiterlernen: Buchkapitel
Frage 9
Welche Aussage über die Required-Semantik von @Autowired ist standardmäßig korrekt?
- A) Injection ist optional, außer
@Autowired(required = false)ist gesetzt - B) Primitive Abhängigkeiten sind immer optional
- C) Alle Abhängigkeiten werden unabhängig von der Annotation lazy initialisiert
- D) Wenn kein passender Bean existiert, schlägt der Context-Start mit NoSuchBeanDefinitionException fehl
Antwort & Erklärung
Richtige Antwort: D
Standardmäßig ist @Autowired required=true. Kann Spring keinen eindeutigen passenden Bean für einen erforderlichen Injection Point auflösen, schlägt die ApplicationContext-Initialisierung mit NoSuchBeanDefinitionException oder verwandter Ambiguitäts-Exception fehl.
Warum die anderen Optionen falsch sind:
- A) Required ist standardmäßig true; optionale Injection braucht
required=false. - B) Fehlende Primitive-Collaborators führen trotzdem zum Fehler, weil null nicht injiziert werden kann.
- C) @Autowired erzwingt keine Lazy-Initialisierung der Abhängigkeit.
Merksatz: „Standard-@Autowired ist required; required=false nur für optionale Collaborators."
Weiterlernen: Buchkapitel
Frage 10
Ein Team diskutiert, ob XML, Java-Config oder Component Scanning für eine kleine interne Utility-Bibliothek genutzt werden soll, die von Spring-Boot-Apps konsumiert wird.
Welcher Ansatz lässt Spring Klassen mit Stereotype-Annotationen entdecken, ohne für jede Klasse explizite @Bean-Methoden zu schreiben?
@Service
public class PricingService { }
- A) Jede Klasse in beans.xml deklarieren
- B) BeanFactoryPostProcessor manuell für jeden Typ nutzen
- C) Component Scanning mit @Component, @Service, @Repository oder @Controller
- D) Klassen nur über @PropertySource registrieren
Antwort & Erklärung
Richtige Antwort: C
Component Scanning erkennt Classpath-Kandidaten mit Stereotype-Annotationen und registriert sie automatisch als Bean-Definitionen. Das spart Boilerplate-@Bean-Factory-Methoden für einfache Klassen.
Warum die anderen Optionen falsch sind:
- A) XML kann Beans deklarieren, entdeckt aber annotierte Klassen nicht automatisch, außer component-scan ist konfiguriert.
- B) BeanFactoryPostProcessor ist ein Low-Level-Extension Point, nicht der normale Discovery-Mechanismus.
- D) @PropertySource lädt Properties, keine Komponenten-Klassen.
Merksatz: „Stereotype-Annotationen plus Component Scanning registrieren Beans automatisch."
Weiterlernen: Buchkapitel
Frage 11
In einer @Configuration-Klasse: Was sagt @Bean auf einer Methode Spring?
@Configuration
public class AppConfig {
@Bean
public Clock systemClock() {
return Clock.systemUTC();
}
}
- A) Den Rückgabetyp sofort instanziieren, wenn die Klasse geladen wird
- B) Den Rückgabewert der Methode als vom Container verwalteten Bean registrieren
- C) Die Methode als REST-Endpoint bereitstellen
- D) Die Methode bei jedem HTTP-Request ausführen
Antwort & Erklärung
Richtige Antwort: B
@Bean-Methoden werden durch Configuration-Class-Enhancement verarbeitet, sodass Spring sie aufruft, um Beans im Container zu registrieren. Der Container steuert Lifecycle und Injection des zurückgegebenen Objekts.
Warum die anderen Optionen falsch sind:
- A) Das JVM-Laden der Klasse erzeugt den Bean nicht; das passiert beim Context-Refresh durch den Container.
- C) REST-Exposition braucht Web-Mapping-Annotationen, nicht @Bean.
- D) @Bean hat kein Request-Scope-Verhalten von sich aus.
Merksatz: „@Bean-Methode = Factory-Methode, deren Rückgabewert ein Spring Bean wird."
Weiterlernen: Buchkapitel
Frage 12
Ein Payment-Client soll in Nicht-Produktion auf Sandbox zeigen und bei aktivem Profil prod auf die Produktions-URL.
Welche Kombination ist der idiomatische Weg, unterschiedliche PaymentClient-Beans pro Umgebung bereitzustellen?
@Bean
@Profile("prod")
public PaymentClient prodClient() { return new ProdPaymentClient(); }
@Bean
@Profile("!prod")
public PaymentClient sandboxClient() { return new SandboxPaymentClient(); }
- A) Zwei @Bean-Methoden mit @Profile-Bedingungen für verschiedene Umgebungen
- B) Ein Bean und manuelle if-Abfragen in main
- C) Scope nur auf Prototype ändern
- D) @Order auf beiden Beans ohne Profile
Antwort & Erklärung
Richtige Antwort: A
@Profile registriert Bean-Definitionen bedingt basierend auf aktiven Profilen. Das hält umgebungsspezifische Verdrahtung deklarativ und integriert sauber mit Spring-Boot-Profil-Aktivierung über Properties oder Umgebungsvariablen.
Warum die anderen Optionen falsch sind:
- B) Manuelles Branching in main umgeht den Container und ist nicht idiomatisch.
- C) Prototype-Scope erzeugt neue Instanzen, wählt aber keine umgebungsspezifischen Implementierungen.
- D) @Order aktiviert keine Beans nach Umgebung.
Merksatz: „@Profile nutzen, um umgebungsspezifische Beans deklarativ zu registrieren."
Weiterlernen: Buchkapitel
Frage 13
Was ermöglicht @ConfigurationProperties(prefix = "app.mail") auf einer Klasse primär?
@ConfigurationProperties(prefix = "app.mail")
public record MailProperties(String host, int port) {}
- A) Eine JPA-Entity, die auf die Mail-Tabelle gemappt ist
- B) Methoden-Level-Transaktionsmanagement für Mail-Code
- C) Binden externer Konfigurations-Properties mit dem Präfix
app.mailauf die Klassenfelder - D) Classpath-Scanning nur für Mail-Templates
Antwort & Erklärung
Richtige Antwort: C
@ConfigurationProperties bindet strukturierte Konfiguration aus Property-Dateien, Umgebungsvariablen und anderen PropertySources auf ein typisiertes Objekt. Das ist besser als viele separate @Value-Injections für gruppierte Einstellungen.
Warum die anderen Optionen falsch sind:
- A) Hat nichts mit JPA-Entity-Mapping zu tun.
- B) Transaktionsmanagement kommt von @EnableTransactionManagement, nicht von @ConfigurationProperties.
- D) Führt kein Template-Classpath-Scanning durch.
Merksatz: „@ConfigurationProperties gruppiert und bindet externe Config in einen typisierten Bean."
Weiterlernen: Buchkapitel
Frage 14
Ein Singleton DashboardService injiziert einen request-scoped UserContext-Bean. Nutzer berichten, alle Requests sehen dieselben User-Daten.
Was ist die korrekte Lösung, wenn ein Singleton-Bean pro HTTP-Request einen frischen UserContext braucht?
- A) DashboardService nur auf Prototype-Scope ändern
- B) UserContext mit @RequestScope markieren und einen Proxy in den Singleton injizieren (scoped-proxy)
- C) UserContext manuell in statischem ThreadLocal speichern ohne Spring-Unterstützung
- D) Singleton-Scope global in application.properties deaktivieren
Antwort & Erklärung
Richtige Antwort: B
Ein kürzer lebender Scoped Bean, der in einen länger lebenden Singleton injiziert wird, braucht einen Scoped Proxy, damit der Singleton einen Proxy hält, der pro Request an die aktuelle Scope-Instanz delegiert. Spring bietet das über @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) oder @RequestScope auf einem Bean, der über Injection-Proxy konsumiert wird.
Warum die anderen Optionen falsch sind:
- A) Den Singleton zu Prototype zu machen erzeugt viele Service-Instanzen und bricht meist die Architektur.
- C) Manuelles statisches ThreadLocal umgeht Spring-Scope-Management und ist hier ein Anti-Pattern.
- D) Singleton ist der Default und kann so nicht global deaktiviert werden.
Merksatz: „Singleton, der Request/Session-Bean injiziert, braucht Scoped Proxy."
Weiterlernen: Buchkapitel
Frage 15
Welcher Bean-Scope erzeugt bei jeder Anforderung vom Container eine neue Instanz?
- A) Singleton
- B) Prototype
- C) Request
- D) Application
Antwort & Erklärung
Richtige Antwort: B
Prototype-Scope sagt Spring, bei jedem getBean oder Injection-Point-Auflösung — je nach Kontext — eine neue Bean-Instanz zu erzeugen, anders als Singleton mit einer gemeinsamen Instanz.
Warum die anderen Optionen falsch sind:
- A) Singleton liefert dieselbe gemeinsame Instanz.
- C) Request-Scope ist eine Instanz pro HTTP-Request, nicht pro Injection.
- D) Application-Scope ist eine Instanz pro ServletContext in Web-Apps.
Merksatz: „Prototype = neue Instanz pro Abruf/Injection-Zyklus."
Weiterlernen: Buchkapitel
Frage 16
Operations aktiviert spring.profiles.active=prod,cloud beim Deployment. Einige Beans laden weiterhin aus dem Default-Profil-Set.
Wie wertet Spring @Profile("prod") auf einer @Bean-Methode aus, wenn die aktiven Profile prod und cloud sind?
- A) Der Bean wird nicht registriert, weil mehrere aktive Profile @Profile ungültig machen
- B) Der Bean wird registriert, weil
prodzu den aktiven Profilen gehört - C) Der Bean registriert sich nur, wenn
cloudauch in @Profile genannt ist - D) Profile müssen sich gegenseitig ausschließen, sonst schlägt der Startup fehl
Antwort & Erklärung
Richtige Antwort: B
Mehrere aktive Profile koexistieren. Eine @Profile-Bedingung matcht, wenn ein gelisteter Profil-Ausdruck erfüllt ist. @Profile("prod") matcht, wenn prod aktiv ist — unabhängig von zusätzlichen Profilen wie cloud.
Warum die anderen Optionen falsch sind:
- A) Mehrere aktive Profile sind normal und unterstützt.
- C)
@Profile("prod")verlangt nicht, dass jedes aktive Profil in der Annotation steht. - D) Profile müssen sich nicht gegenseitig ausschließen.
Merksatz: „Mehrere Profile können aktiv sein; @Profile matcht, wenn sein Ausdruck erfüllt ist."
Weiterlernen: Buchkapitel
Frage 17
Was ist der Zweck eines BeanPostProcessor im Spring-Container-Lifecycle?
- A) PropertySource-Dateien zur Laufzeit ersetzen
- B) Bean-Initialisierung abfangen und Beans vor und nach Initialisierungs-Callbacks modifizieren oder wrappen
- C) @Configuration-Klassen schneller nach Bytecode kompilieren
- D) HTTP-Requests auf Controller-Methoden mappen
Antwort & Erklärung
Richtige Antwort: B
BeanPostProcessor ist ein Extension Point, der vor und nach der Bean-Initialisierung für jeden Bean aufgerufen wird. Spring nutzt viele interne BPPs für Annotation-Verarbeitung, AOP-Proxy-Erzeugung und @Autowired-Injection.
Warum die anderen Optionen falsch sind:
- A) PropertySource-Änderungen übernehmen Environment und PropertySource-Mechanismen.
- C) Configuration-Class-Verarbeitung nutzt ConfigurationClassPostProcessor, einen spezialisierten BPP — der generische BPP-Zweck ist Bean-Anpassung.
- D) Handler Mapping ist Teil von Spring MVC, nicht BeanPostProcessor.
Merksatz: „BeanPostProcessor hakt vor/nach Bean-Initialisierung für jeden Bean ein."
Weiterlernen: Buchkapitel
Frage 18
Eine @Configuration-Klasse definiert zwei @Bean-Methoden, wobei eine die andere direkt innerhalb derselben Klasse aufruft.
Was macht Spring bei @Bean-Methoden-Inter-Calls innerhalb derselben @Configuration-Klasse?
@Configuration
public class BillingConfig {
@Bean
public InvoiceService invoiceService(TaxCalculator taxCalculator) {
return new InvoiceService(taxCalculator);
}
@Bean
public TaxCalculator taxCalculator() {
return new TaxCalculator();
}
}
- A) Jeder Aufruf erzeugt ein frisches Objekt, weil es normale Java-Methodenaufrufe sind
- B) Spring proxyt die Configuration-Klasse, sodass @Bean-Methodenaufrufe über den Container laufen und Singleton-Semantik respektieren
- C) Inter-Calls sind verboten und verursachen BeanCurrentlyInCreationException
- D) Nur XML-Konfiguration kann Beans zwischen Factory-Methoden teilen
Antwort & Erklärung
Richtige Antwort: B
Vollständige @Configuration-Klassen werden enhanced, sodass Inter-Bean-Methodenaufrufe über den Container geproxyt werden. Das stellt sicher, dass Singleton-Beans wiederverwendet werden, statt versehentlich durch direkte Java-Aufrufe neu erzeugt zu werden.
Warum die anderen Optionen falsch sind:
- A) Plain @Configuration ohne Full Mode würde Beans neu erzeugen, aber Full @Configuration verhindert das per Proxy.
- C) Inter-Calls sind by Design unterstützt.
- D) Java @Configuration ist der Standardansatz für zusammengehörige @Bean-Methoden.
Merksatz: „Full @Configuration proxyt @Bean-Methodenaufrufe, damit Singletons Singleton bleiben."
Weiterlernen: Buchkapitel
Frage 19
Welche drei Annotationen sind in @SpringBootApplication meta-komponiert?
@SpringBootApplication
public class ShopApplication {
public static void main(String[] args) {
SpringApplication.run(ShopApplication.class, args);
}
}
- A) @EnableWebMvc, @EnableJpaRepositories, @EnableScheduling
- B) @Controller, @Service, @Repository
- C) @Transactional, @Validated, @CrossOrigin
- D) @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan
Antwort & Erklärung
Richtige Antwort: D
@SpringBootApplication kombiniert @SpringBootConfiguration (spezialisierte @Configuration), @EnableAutoConfiguration und @ComponentScan (mit optionalen Attributen). Das ist die Bootstrap-Annotation für Spring-Boot-Apps.
Warum die anderen Optionen falsch sind:
- A) Das sind separate Opt-in-Annotationen, nicht Teil von @SpringBootApplication.
- B) Stereotype-Annotationen sind nicht in @SpringBootApplication meta-komponiert.
- C) Diese Annotationen dienen anderen Belangen und sind nicht das Boot-Bootstrap-Trio.
Merksatz: „@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan."
Weiterlernen: Buchkapitel
Frage 20
Ein Team fügt spring-boot-starter-data-jpa hinzu, will aber einen eigenen DataSource-Bean aus Firmenbibliothekscode bereitstellen.
Wenn du deinen eigenen DataSource-@Bean definierst, was macht Spring-Boot-Auto-Configuration typischerweise?
- A) Es schlägt fehl, weil zwei DataSource-Beans nie erlaubt sind
- B) Es tritt zurück und konfiguriert keine Default-DataSource
- C) Es erzeugt trotzdem immer die Default-HikariCP-DataSource
- D) Es löscht den Custom Bean und behält nur den auto-konfigurierten
Antwort & Erklärung
Richtige Antwort: B
Spring-Boot-Auto-Configuration nutzt @ConditionalOnMissingBean, sodass benutzerdefinierte Beans Vorrang haben. Wenn du deine eigene DataSource bereitstellst, tritt DataSource-Auto-Configuration zurück — das Back-off-Muster wird häufig geprüft.
Warum die anderen Optionen falsch sind:
- A) Mehrere Definitionen sind erlaubt, wenn Auto-Config zurücktritt.
- C) Auto-Config respektiert bestehende User-Beans über Missing-Bean-Bedingungen.
- D) Spring entfernt niemals still User-Beans.
Merksatz: „User-@Bean eines Typs lässt passende Auto-Configuration zurücktreten."
Weiterlernen: Buchkapitel
Frage 21
Welche Property hilft, einen Bericht über Auto-Configuration-Entscheidungen zu erzeugen — was gematcht hat und was nicht?
# application.properties
debug=true
- A) spring.main.banner-mode=off
- B) logging.level.root=ERROR
- C) debug=true
- D) spring.jpa.show-sql=true
Antwort & Erklärung
Richtige Antwort: C
debug=true (oder --debug) aktiviert den Auto-Configuration-Report beim Startup und in den Logs mit positiven und negativen Matches. Das ist das Hauptwerkzeug, um zu verstehen, warum eine Boot-Auto-Config angewendet wurde oder nicht.
Warum die anderen Optionen falsch sind:
- A) Banner-Mode betrifft nur das Startup-Banner.
- B) Root-Log-Level erzeugt den Condition-Evaluation-Report nicht von selbst.
- D) show-sql loggt SQL-Statements, nicht Auto-Configuration-Bedingungen.
Merksatz: „debug=true druckt den Auto-Configuration-Condition-Evaluation-Report."
Weiterlernen: Buchkapitel
Frage 22
Ein Microservice stellt Management-Endpoints auf einem separaten Port für das Platform-Team bereit.
Welche Konfiguration verschiebt Actuator-HTTP-Endpoints auf Port 9090, während die Haupt-App auf 8080 bleibt?
management.server.port=9090
- A) Nur server.port=9090
- B) Nur management.endpoints.web.exposure.include=*
- C) spring.application.name=actuator
- D) management.server.port=9090 auf einem separaten Management-Listener
Antwort & Erklärung
Richtige Antwort: D
management.server.port erzeugt einen separaten Management-Server/Port für Actuator-Endpoints in Servlet-basierten Apps und ermöglicht Netzwerk-Isolation vom Hauptanwendungs-Port (server.port).
Warum die anderen Optionen falsch sind:
- A) server.port verschiebt die Hauptanwendung, nicht nur Actuator.
- B) Exposure-Einstellungen steuern, welche Endpoints web-sichtbar sind, nicht den Port.
- C) Application Name bindet Actuator nicht an einen anderen Port.
Merksatz: „management.server.port betreibt Actuator auf eigenem HTTP-Port."
Weiterlernen: Buchkapitel
Frage 23
Standardmäßig in Spring Boot 2.x/3.x: Welcher Actuator-Endpoint ist über HTTP ohne zusätzliche Konfiguration exponiert?
- A) env
- B) beans
- C) health
- D) shutdown
Antwort & Erklärung
Richtige Antwort: C
Standard-Web-Exposure umfasst historisch nur health (und info in manchen Versionen mit versteckten Details). Sensible Endpoints wie env, beans und shutdown brauchen explizite Exposure-Konfiguration aus Sicherheitsgründen.
Warum die anderen Optionen falsch sind:
- A) env ist standardmäßig nicht über Web exponiert.
- B) beans ist nicht im Default-Web-Exposure-Set.
- D) shutdown ist deaktiviert und standardmäßig nicht exponiert.
Merksatz: „Standardmäßig exponierter Actuator-Web-Endpoint ist health, außer du erweiterst die Exposure."
Weiterlernen: Buchkapitel
Frage 24
Produktions-Health-Checks müssen DOWN melden, wenn die App ihre erforderliche Datenbank nicht erreicht, die JVM aber trotzdem starten.
Welcher Ansatz integriert Datenbank-Verfügbarkeit korrekt in den Application-Health-Endpoint?
- A) Eigene main-Methode mit try/catch nur um SpringApplication.run
- B) Auf HealthContributor oder DataSource-Health-Indicator-Auto-Configuration für den Health-Endpoint vertrauen
- C) Alle Actuator-Endpoints in Produktion deaktivieren
- D) @PostConstruct in jeder Repository-Klasse nutzen
Antwort & Erklärung
Richtige Antwort: B
Spring-Boot-Actuator-Health gruppiert Infrastruktur-Checks über HealthContributor-Beans. DataSourceHealthContributor-Auto-Configuration meldet Datenbankstatus auf /actuator/health, den Orchestratoren nutzen können — ohne Custom-Shutdown-Logik.
Warum die anderen Optionen falsch sind:
- A) try/catch in main erzeugt keine strukturierten Health-Endpoint-Ergebnisse.
- C) Actuator deaktivieren entfernt das Standard-Health-Signal, das Operatoren erwarten.
- D) Repository-@PostConstruct integriert sich nicht in Actuator-Health-Aggregation.
Merksatz: „Health Contributors aggregieren Komponentenstatus in /actuator/health."
Weiterlernen: Buchkapitel
Frage 25
Was ist der Hauptzweck von Spring-Boot-Startern wie spring-boot-starter-web?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- A) Sie ersetzen den ApplicationContext
- B) Sie schreiben automatisch Controller-Code aus OpenAPI-Dateien
- C) Sie deaktivieren Auto-Configuration für minimale Apps
- D) Sie bündeln kuratierte Dependencies mit Versionen, die durch spring-boot-dependencies-BOM abgestimmt sind
Antwort & Erklärung
Richtige Antwort: D
Starter sind Dependency-Deskriptoren, die eine sinnvolle Bibliotheksmenge mit vom Boot-BOM verwalteten Versionen ziehen. Sie reduzieren manuelle Dependency-Verdrahtung und bleiben mit Boot-Auto-Configuration kompatibel.
Warum die anderen Optionen falsch sind:
- A) Der Container verwaltet weiterhin Beans; Starter betreffen nur Classpath-Dependencies.
- B) Starter generieren keinen Anwendungscode.
- C) Starter aktivieren meist verwandte Auto-Configuration, wenn sie im Classpath sind.
Merksatz: „Starter = kuratierte Dependencies mit BOM-verwalteten Versionen."
Weiterlernen: Buchkapitel
Frage 26
Der Startup ist langsam und das Team vermutet, dass ungenutzte Beans trotzdem eager initialisiert werden.
Welches Spring-Boot-Feature verzögert die Erzeugung von Singleton-Beans bis zur ersten Nutzung?
- A) spring.main.lazy-initialization=true
- B) @RefreshScope auf jedem Bean
- C) Nur spring.jpa.defer-datasource-initialization
- D) server.tomcat.max-threads=1
Antwort & Erklärung
Richtige Antwort: A
Globale Lazy Initialization sagt dem Application Context, Singleton-Beans bei erster Anforderung statt beim Refresh zu erzeugen. Das kann den Startup verkürzen, wenn viele Beans früh ungenutzt sind — mit Trade-offs beim Fail-Fast-Timing.
Warum die anderen Optionen falsch sind:
- B) @RefreshScope ist für Cloud-refreshable Beans, nicht allgemeines Lazy Startup.
- C) Defer Datasource Initialization betrifft SQL-Init-Timing, nicht alle Bean-Erzeugung.
- D) Tomcat-Thread-Einstellungen steuern nicht Bean-Initialisierungs-Timing.
Merksatz: „spring.main.lazy-initialization=true erzeugt Singletons bei erster Nutzung."
Weiterlernen: Buchkapitel
Frage 27
Eine Klasse implementiert ApplicationRunner und ist als Spring Bean registriert. Wann wird ihre run-Methode ausgeführt?
- A) Bevor der ApplicationContext erzeugt wird
- B) Nach Context-Refresh und Anwendungsstart, als Teil der Startup-Callbacks
- C) Bei jedem HTTP-Request nach DispatcherServlet-Mapping
- D) Nur wenn actuator/refresh aufgerufen wird
Antwort & Erklärung
Richtige Antwort: B
ApplicationRunner- und CommandLineRunner-Beans laufen nach abgeschlossenem Context-Startup — ein sicherer Zeitpunkt, wenn die Anwendung bereit ist. Spring Boot sammelt und ruft sie beim Startup auf.
Warum die anderen Optionen falsch sind:
- A) Der Context muss existieren und refreshed sein.
- C) Runner sind Startup-Hooks, keine per-Request-Handler.
- D) Refresh-Endpoints sind unabhängig von standardmäßiger ApplicationRunner-Ausführung.
Merksatz: „ApplicationRunner läuft einmal, nachdem der Spring Context gestartet ist."
Weiterlernen: Buchkapitel
Frage 28
Eine Auto-Config-Klasse soll nur gelten, wenn die Klasse org.apache.catalina.startup.Tomcat im Classpath ist.
Welche Condition-Annotation drückt Classpath-basierte Auto-Configuration-Guards aus?
- A) @ConditionalOnBean(Tomcat.class)
- B) Nur @ConditionalOnWebApplication
- C) @Profile("tomcat")
- D) @ConditionalOnClass(name = "org.apache.catalina.startup.Tomcat")
Antwort & Erklärung
Richtige Antwort: D
@ConditionalOnClass prüft die Anwesenheit angegebener Klassen im Classpath, ohne die Klasse in die Configuration-Klasse selbst laden zu müssen. Auto-Configuration-Module nutzen es stark, um Servlet-, Tomcat- oder bibliotheksspezifische Config zu aktivieren.
Warum die anderen Optionen falsch sind:
- A) @ConditionalOnBean prüft bestehende Beans, nicht bloße Classpath-Anwesenheit.
- B) @ConditionalOnWebApplication prüft App-Typ, nicht eine spezifische Tomcat-Klasse.
- C) Profile sind orthogonal zu Classpath-Bedingungen.
Merksatz: „@ConditionalOnClass gated Auto-Config sicher nach Classpath-Anwesenheit."
Weiterlernen: Buchkapitel
Frage 29
Ein Browser-Formular-POST und ein Mobile-JSON-Client treffen denselben Endpoint. Das Team will, dass eine Controller-Methode Binding passend handhabt.
Welche Komponente ist in Spring MVC der Front Controller, der alle HTTP-Requests empfängt und an Handler Mappings und Controller delegiert?
Client -> DispatcherServlet -> HandlerMapping -> Controller
- A) HttpServletRequestWrapper
- B) BeanFactory
- C) DispatcherServlet
- D) Nur HandlerInterceptor
Antwort & Erklärung
Richtige Antwort: C
DispatcherServlet ist der Spring-MVC-Front-Controller. Er routet Requests über HandlerMapping, HandlerAdapter, Controller-Aufruf, View Resolution oder Message Conversion und Exception Handling.
Warum die anderen Optionen falsch sind:
- A) RequestWrapper ist Servlet-API-Dekoration, nicht der MVC-Front-Controller.
- B) BeanFactory ist der IoC-Kern-Container, nicht der Web-Dispatcher.
- D) HandlerInterceptor nimmt an der Chain teil, ersetzt aber nicht DispatcherServlet.
Merksatz: „DispatcherServlet ist der Spring-MVC-Front-Controller-Einstiegspunkt."
Weiterlernen: Buchkapitel
Frage 30
Welche Annotation auf einer Controller-Methode mappt HTTP-GET-Requests auf /api/orders/\{id\} und bindet die Path-Variable id?
@GetMapping("/api/orders/{id}")
public OrderDto get(@PathVariable Long id) { return orderService.find(id); }
- A) @RequestParam("id") auf der Methode
- B) @PostMapping("/api/orders")
- C) @GetMapping mit @PathVariable für {id}
- D) Nur @ResponseStatus ohne Mapping
Antwort & Erklärung
Richtige Antwort: C
@GetMapping auf /api/orders/\{id\} kombiniert mit @PathVariable extrahiert die URI-Template-Variable. Das ist das Standard-REST-Muster für Ressourcenabruf per Identifier.
Warum die anderen Optionen falsch sind:
- A) @RequestParam liest Query-Parameter, keine URI-Pfadsegmente.
- B) POST ist die falsche HTTP-Methode für idempotenten Abruf per id.
- D) @ResponseStatus setzt Statuscodes, definiert aber nicht die Route.
Merksatz: „Path Variables nutzen {name} im Mapping plus @PathVariable."
Weiterlernen: Buchkapitel
Frage 31
Ein POST-Endpoint akzeptiert JSON, Clients senden manchmal XML. Das Team will JSON als Default ohne Custom Parser.
Wie serialisiert und deserialisiert Spring MVC typischerweise Request/Response-Bodies in @RestController-Methoden?
- A) Über HttpMessageConverter-Implementierungen, ausgewählt nach Content Type und Rückgabetyp
- B) Durch direktes Schreiben auf ServletOutputStream in jedem Controller
- C) Über JDBC ResultSet Mapping
- D) Nur über JSP-View-Rendering
Antwort & Erklärung
Richtige Antwort: A
RequestResponseBodyMethodProcessor nutzt HttpMessageConverter-Beans wie MappingJackson2HttpMessageConverter, um Bodies in Objekte und zurück zu konvertieren — basierend auf Content-Type, Accept und Methodensignaturen mit @RequestBody- und @ResponseBody-Semantik.
Warum die anderen Optionen falsch sind:
- B) Controller bleiben normalerweise deklarativ; Converter übernehmen IO.
- C) JDBC ist Persistence-Layer, nicht MVC-Body-Konvertierung.
- D) JSP Views sind für View Resolution, nicht typische @RestController-JSON-APIs.
Merksatz: „HttpMessageConverters binden Request/Response-Bodies in Spring MVC."
Weiterlernen: Buchkapitel
Frage 32
Was bewirkt @RestController auf einer Klasse im Vergleich zu @Controller?
- A) Es kombiniert @Controller und @ResponseBody und schreibt Rückgabewerte über Message Converter
- B) Es deaktiviert DispatcherServlet für diese Klasse
- C) Es erzwingt, dass alle Methoden nur ModelAndView zurückgeben
- D) Es fügt automatisch Spring-Security-Filter hinzu
Antwort & Erklärung
Richtige Antwort: A
@RestController ist eine zusammengesetzte Annotation, äquivalent zu @Controller plus @ResponseBody auf Klassenebene — Methoden-Rückgabewerte werden in den HTTP-Response-Body serialisiert statt als View-Namen aufgelöst.
Warum die anderen Optionen falsch sind:
- B) DispatcherServlet dispatcht weiterhin zum Controller.
- C) ModelAndView ist das Gegenteil des typischen REST-JSON-Rückgabestils.
- D) Security wird separat konfiguriert, nicht durch @RestController.
Merksatz: „@RestController = @Controller + @ResponseBody."
Weiterlernen: Buchkapitel
Frage 33
Ein Client sendet POST /api/users mit fehlender E-Mail. Die API soll 400 mit Validierungsdetails zurückgeben.
Welches Setup aktiviert automatische Validierung von Request-Body-Feldern mit Jakarta-Bean-Validation-Constraints?
public record CreateUserRequest(
@NotBlank String name,
@Email String email
) {}
- A) @Valid oder @Validated auf dem @RequestBody-Parameter plus Constraints am DTO
- B) @Transactional auf der Controller-Methode
- C) @EnableScheduling auf der Application-Klasse
- D) Nur @CrossOrigin auf dem Controller
Antwort & Erklärung
Richtige Antwort: A
Spring MVC triggert Bean Validation, wenn @Valid oder @Validated am @RequestBody-Argument steht und das Objekt Constraint-Annotationen enthält. Fehler werden zu MethodArgumentNotValidException, die von Exception Handlern oder Default-Problem-Responses behandelt wird.
Warum die anderen Optionen falsch sind:
- B) Transaktionen führen keine MVC-Request-Validierung durch.
- C) Scheduling ist unabhängig von Validierung.
- D) CORS steuert Cross-Origin-Zugriff, nicht Validierung.
Merksatz: „@Valid auf @RequestBody aktiviert Bean Validation am DTO."
Weiterlernen: Buchkapitel
Frage 34
Eine Controller-Advice-Klasse soll Validierungsfehler global behandeln und eine konsistente JSON-Fehlerstruktur zurückgeben. Welche Annotation passt auf diese Klasse?
- A) @RepositoryAdvice
- B) @ControllerAdvice
- C) @ConfigurationProperties
- D) @ImportResource
Antwort & Erklärung
Richtige Antwort: B
@ControllerAdvice ist eine Spezialisierung von @Component, die @ExceptionHandler-, @InitBinder- und @ModelAttribute-Methoden controller-übergreifend anwendbar macht. Das ist der Standardmechanismus für globales MVC-Exception Handling.
Warum die anderen Optionen falsch sind:
- A) @RepositoryAdvice ist keine Standard-Spring-MVC-Annotation.
- C) @ConfigurationProperties bindet Config-Werte.
- D) @ImportResource lädt XML-Bean-Definitionen.
Merksatz: „Globales MVC-Exception Handling gehört in @ControllerAdvice."
Weiterlernen: Buchkapitel
Frage 35
Eine API muss 201 Created mit Location-Header auf die neue Ressource zurückgeben.
Welche Kombination drückt HTTP-201-Semantik für eine erzeugte Ressource in Spring MVC am besten aus?
- A) @ResponseStatus(HttpStatus.CREATED) und ResponseEntity mit Location-Header
- B) @GetMapping und immer Status 200
- C) @Deprecated auf der Controller-Klasse
- D) Manuelles Thread-Sleep dann 500-Response
Antwort & Erklärung
Richtige Antwort: A
ResponseEntity oder @ResponseStatus(HttpStatus.CREATED) kommuniziert 201. ResponseEntity ist ideal, wenn du Location und Body-Header für REST-Create-Operationen explizit setzt.
Warum die anderen Optionen falsch sind:
- B) GET mit 200 ist falsch für Ressourcenerstellung.
- C) @Deprecated hat keine HTTP-Semantik.
- D) Künstliche Verzögerung und Server Error sind falsches Verhalten.
Merksatz: „201 CREATED und Location-Header nutzen, wenn Ressourcen erzeugt werden."
Weiterlernen: Buchkapitel
Frage 36
Was macht @RequestParam(defaultValue = "10"), wenn der Query-Parameter page fehlt?
- A) Wirft sofort MissingServletRequestParameterException
- B) Bindet
pagean den String-Wert 10 für den Methodenparameter - C) Leitet den Client auf /error um
- D) Ignoriert den Parameter und lässt ihn für int-Primitive null
Antwort & Erklärung
Richtige Antwort: B
defaultValue liefert einen Fallback, wenn der Request-Parameter fehlt. Bei String-Parametern funktioniert das direkt; bei optionalen Typen verhindert es Absence-Errors und behält explizite Werte bei, wenn gesetzt.
Warum die anderen Optionen falsch sind:
- A) Missing-Parameter-Exceptions entstehen bei required=true ohne Default.
- C) Es gibt keinen automatischen Redirect.
- D) Primitive int können nicht null sein; defaultValue vermeidet Absence-Probleme.
Merksatz: „@RequestParam defaultValue greift, wenn der Query-Parameter fehlt."
Weiterlernen: Buchkapitel
Frage 37
Die Service-Schicht nutzt Spring-Data-JPA-Repositories. Entwickler sind unsicher, wo Transaktionsgrenzen liegen sollten.
Wo sollten @Transactional-Grenzen in einer geschichteten Spring-Anwendung mit JPA am häufigsten platziert werden?
@Service
public class OrderService {
@Transactional
public void placeOrder(OrderRequest request) {
orderRepository.save(toEntity(request));
}
}
- A) Auf jeder Entity-Getter-Methode
- B) Immer nur auf REST-Controller-Methoden
- C) Auf Service-Methoden, die Repository-Operationen und Geschäftsregeln koordinieren
- D) Nur in der main-Methode
Antwort & Erklärung
Richtige Antwort: C
Transaktionsgrenzen gehören in die Service-Schicht, wo Geschäftsoperationen mehrere Repository-Aufrufe koordinieren und Atomarität sicherstellen. Controller sollten dünn bleiben; Entities sollten keine Transaktionsabgrenzung besitzen.
Warum die anderen Optionen falsch sind:
- A) Entity-Methoden sind Persistence-Model-Details, keine Transaktions-Orchestrierungspunkte.
- B) Controller können in seltenen Fällen transaktional sein, aber das ist nicht das primäre Design.
- D) main liegt außerhalb des Request/Service-Transaktionsmodells.
Merksatz: „@Transactional auf Service-Methoden setzen, die Datenänderungen orchestrieren."
Weiterlernen: Buchkapitel
Frage 38
Was leitet Spring Data JPA aus einer Methode namens findByEmailAndActiveTrue ab?
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByEmailAndActiveTrue(String email);
}
- A) Einen Stored-Procedure-Aufruf namens sp_findByEmailAndActiveTrue
- B) Automatisch ein natives SQL-Skript in schema.sql
- C) Eine Query, die Entities selektiert, wo email dem Parameter entspricht und active true ist
- D) Nichts; Methodennamen werden von Spring Data ignoriert
Antwort & Erklärung
Richtige Antwort: C
Spring Data JPA parst Methodennamen gegen Domain-Model-Property-Pfade und generiert Queries. findByEmailAndActiveTrue mappt auf WHERE email = ?1 AND active = true für die vom Repository verwaltete Entity.
Warum die anderen Optionen falsch sind:
- A) Procedure-Ausführung braucht @Procedure und explizite Konfiguration.
- B) schema.sql initialisiert Schema; es definiert keine Derived-Query-Methoden.
- D) Derived Query Methods sind ein Kernfeature von Spring Data.
Merksatz: „Derived Query Methodennamen kodieren Property-Bedingungen nach By."
Weiterlernen: Buchkapitel
Frage 39
Ein read-only Report-Endpoint ruft einen Service auf, der Repositories abfragt. Das Team will versehentliches Flushen dirty Entities und Optimierung von Read-Pfaden vermeiden.
Welches @Transactional-Attribut passt für eine read-only Query-Service-Methode?
- A) readOnly = true
- B) propagation = REQUIRES_NEW immer für Reads
- C) rollbackFor = Exception bei jedem Read
- D) Nur timeout = -1
Antwort & Erklärung
Richtige Antwort: A
readOnly=true signalisiert, dass die Transaktion nur lesend ist — das ermöglicht Optimierungen und reduziert unbeabsichtigte Zustandsänderungen bei manchen Providern. Das ist die Standardwahl für reine Query-Service-Methoden.
Warum die anderen Optionen falsch sind:
- B) REQUIRES_NEW erzeugt eine neue Transaktion; das ist nicht die Default-Read-Optimierung.
- C) rollbackFor konfiguriert Write-Failure-Verhalten, nicht Read-Semantik.
- D) timeout allein markiert eine Transaktion nicht als read-only.
Merksatz: „@Transactional(readOnly = true) für reine Query-Service-Methoden nutzen."
Weiterlernen: Buchkapitel
Frage 40
Eine mit @Transactional annotierte Methode ruft eine andere @Transactional-Methode in derselben Klasse auf. Was passiert mit Transaction Advice beim internen Aufruf?
@Service
public class TransferService {
@Transactional
public void transfer() {
debit();
credit();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void debit() { accountRepository.debit(); }
}
- A) REQUIRES_NEW startet immer eine neue Transaktion, weil die Annotation gesetzt ist
- B) Spring-AOP-Proxy wird bei Self-Invocation umgangen, debit läuft ohne erwartete neue Transaktionsgrenze
- C) Beide Methoden laufen automatisch ohne Transaktion
- D) Spring wandelt den Aufruf in eine JMS-Nachricht um
Antwort & Erklärung
Richtige Antwort: B
@Transactional wird über Spring-AOP-Proxies angewendet. Ein direkter this.debit()-Aufruf im selben Target-Objekt umgeht den Proxy, sodass verschachtelte Transaktionseinstellungen wie REQUIRES_NEW nicht greifen — außer du refactorst zum Proxy-Aufruf oder injizierst ein Self-Interface.
Warum die anderen Optionen falsch sind:
- A) Annotation allein reicht ohne Proxy-Interception nicht.
- C) Der externe transfer-Aufruf kann weiterhin transaktional über den Proxy sein.
- D) Transaktionsabgrenzung hat nichts mit Messaging-Konvertierung zu tun.
Merksatz: „Self-Invocation überspringt den Proxy — @Transactional greift intern oft nicht."
Weiterlernen: Buchkapitel
Frage 41
Welche JPA-Annotation markiert ein Feld als Primärschlüssel mit datenbankgenerierten Werten in den meisten relationalen Datenbanken?
- A) Nur @Column(unique = true)
- B) @GeneratedValue mit @Id
- C) @Transient
- D) Nur @Embeddable
Antwort & Erklärung
Richtige Antwort: B
@Id bezeichnet den Primärschlüssel und @GeneratedValue konfiguriert Identity-, Sequence- oder Table-Generation-Strategien. Zusammen definieren sie Surrogate Keys, wie sie in Spring-Data-JPA-Entities üblich sind.
Warum die anderen Optionen falsch sind:
- A) Unique-Column-Constraint definiert keine Primärschlüssel-Generierung.
- C) @Transient schließt ein Feld von Persistence aus.
- D) @Embeddable komponiert Value Types, nicht Primärschlüssel-Identität allein.
Merksatz: „@Id plus @GeneratedValue definiert einen auto-generierten Primärschlüssel."
Weiterlernen: Buchkapitel
Frage 42
Eine Order-Entity hat eine lazy @OneToMany-Collection. Ein REST-Controller gibt die Order-Entity direkt zurück und Clients sehen LazyInitializationException.
Was ist die Ursache und eine saubere architektonische Lösung?
- A) Jackson kann keine Integer serialisieren; auf XML wechseln
- B) Lazy Collection wurde außerhalb eines offenen Persistence Contexts zugegriffen; in transaktionalem Read auf DTO mappen oder wo passend Fetch Join nutzen
- C) @Entity-Annotation von Order entfernen
- D) Alle Transaktionen global deaktivieren
Antwort & Erklärung
Richtige Antwort: B
Lazy Associations laden nur innerhalb einer Session. Entity-Graphen in der Web-Schicht zu serialisieren passiert oft nach Transaktionsende und triggert LazyInitializationException. DTO-Projektion oder Fetch-Strategie innerhalb der Service-Transaktion behebt das Grenzproblem.
Warum die anderen Optionen falsch sind:
- A) Der Fehler ist Lazy-Loading-Timing, nicht Integer-Serialisierung.
- C) @Entity entfernen bricht Persistence Mapping komplett.
- D) Transaktionen werden gebraucht; das Problem ist Session-Grenze und API-Design.
Merksatz: „Lazy-JPA-Graphen nicht in der Web-Schicht exponieren; DTOs oder Fetch innerhalb der Transaktion."
Weiterlernen: Buchkapitel
Frage 43
Was ist die Default-Transaktions-Propagation, wenn @Transactional kein propagation-Attribut hat?
@Transactional // propagation = Propagation.REQUIRED by default
public void updateAccount() { accountRepository.save(changes); }
- A) REQUIRED
- B) NOT_SUPPORTED
- C) NEVER
- D) MANDATORY
Antwort & Erklärung
Richtige Antwort: A
Propagation REQUIRED joint eine bestehende Transaktion oder erzeugt eine neue, wenn keine existiert. Das ist der Default und das Verhalten, das du siehst, außer du wählst explizit REQUIRES_NEW, SUPPORTS oder andere Modi.
Warum die anderen Optionen falsch sind:
- B) NOT_SUPPORTED suspendiert Transaktionen; nicht der Default.
- C) NEVER verbietet transaktionalen Context; nicht Default.
- D) MANDATORY verlangt bestehende Transaktion; nicht Default.
Merksatz: „Default-Propagation ist REQUIRED: joinen oder erzeugen."
Weiterlernen: Buchkapitel
Frage 44
Ein Bulk-Update löscht inaktive User mit einem einzelnen JPQL-Statement. Repository-Nutzer erwarten automatische Persistence-Context-Synchronisation.
Welches Spring-Data-JPA-Feature führt ein JPQL-UPDATE/DELETE-Statement aus, ohne Entities in den Speicher zu laden?
- A) @Modifying Query Method mit @Query JPQL update/delete
- B) Nur findAll dann delete in einer for-Schleife
- C) @EntityGraph auf einer Finder-Methode
- D) Nur @Version-Feld
Antwort & Erklärung
Richtige Antwort: A
@Modifying auf einer @Query-Methode führt Bulk-UPDATE oder -DELETE JPQL/SQL direkt aus. Entwickler müssen auch clearAutomatically und Transaktionsgrenzen bedenken, weil der Persistence Context nach Bulk-Operationen veraltet sein kann.
Warum die anderen Optionen falsch sind:
- B) Jedes Entity laden nur zum Einzel-Löschen verfehlt den Zweck von Bulk-Operationen und skaliert schlecht.
- C) Entity Graphs steuern Fetch Graphs für Queries, nicht Bulk-Update/Delete-Ausführung.
- D) @Version ermöglicht Optimistic Locking auf Entities, führt aber keine Bulk-JPQL-Statements aus.
Merksatz: „@Modifying @Query führt Bulk-Updates/Deletes ohne Entity-für-Entity-Laden aus."
Weiterlernen: Buchkapitel
Frage 45
Eine stateless REST-API muss Bearer-Tokens bei jedem Request authentifizieren ohne serverseitige HTTP-Sessions.
Welche Spring-Security-Konfigurationsrichtung passt am besten zu einer stateless JWT-gestützten API?
http.sessionManagement(s -> s.sessionCreationPolicy(STATELESS));
http.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
- A) formLogin mit Default-Success-URL /home
- B) rememberMe immer aktiviert mit persistenten Tokens in JDBC
- C) sessionManagement sessionCreationPolicy STATELESS plus Filter, der Tokens vor UsernamePasswordAuthenticationFilter validiert
- D) CSRF aktiviert mit HttpSession-Pflicht für jeden Request
Antwort & Erklärung
Richtige Antwort: C
Stateless APIs deaktivieren Session-Erzeugung für Auth-State und verlassen sich auf per-Request-Token-Validierung in der Security-Filter-Chain. Ein Custom OncePerRequestFilter oder Resource-Server-Support validiert Credentials und befüllt den SecurityContext pro Request.
Warum die anderen Optionen falsch sind:
- A) Form Login ist browser-session-orientiert, nicht typisch für Bearer-Token-APIs.
- B) Remember-me zentriert weiterhin Session/Cookie-Muster, unpassend für reine stateless JWT-APIs.
- D) CSRF-Schutz ist wichtig für Cookie-Sessions; stateless Bearer-Setups deaktivieren CSRF oft für reine APIs, schützen aber weiterhin session-basierte Apps.
Merksatz: „Stateless APIs nutzen STATELESS Sessions und per-Request-Token-Authentication-Filter."
Weiterlernen: Buchkapitel
Frage 46
In der Spring-Security-Filter-Chain-Architektur: Wo wird der SecurityContext typischerweise für einen Request gespeichert?
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- A) Nur in der Datenbank-User-Tabelle
- B) Dauerhaft im JPA EntityManager
- C) In application.properties
- D) In SecurityContextHolder, oft mit ThreadLocal für Servlet-Requests
Antwort & Erklärung
Richtige Antwort: D
SecurityContextHolder hält Principal und Authorities für den aktuellen Thread während der Request-Verarbeitung. Servlet-Filter befüllen und leeren ihn um die Chain, um Credential-Leaks zwischen Requests zu vermeiden.
Warum die anderen Optionen falsch sind:
- A) User-Tabellen speichern Credentials oder Accounts, nicht per-Request-Context.
- B) EntityManager ist Persistence-Infrastruktur, nicht Security-Context-Speicher.
- C) Properties-Dateien halten keinen Runtime-Authentication-State.
Merksatz: „SecurityContextHolder trägt Authentication für den aktuellen Request-Thread."
Weiterlernen: Buchkapitel
Frage 47
Administratoren brauchen /admin/-Endpoints auf ROLE_ADMIN beschränkt, während andere authentifizierte User /app/ nutzen dürfen.
Welcher Ausdruck auf einer authorizeHttpRequests-Regel gewährt Zugriff nur für User mit ROLE_ADMIN?
- A) permitAll() für /admin/**
- B) hasRole("ADMIN") für /admin/**-Requests
- C) anonymous() für /admin/**
- D) Nur csrf().disable()
Antwort & Erklärung
Richtige Antwort: B
hasRole("ADMIN") prüft auf ROLE_ADMIN-Authority nach Spring-Security-Rollen-Namenskonvention. Methoden- und HTTP-Authorization-Regeln nutzen solche Ausdrücke für rollenbasierte Zugriffskontrolle.
Warum die anderen Optionen falsch sind:
- A) permitAll erlaubt jeden inklusive anonymer User.
- C) anonymous beschränkt auf nicht authentifizierte User — Gegenteil von admin-only.
- D) CSRF-Einstellungen definieren keine Authorization-Rollen.
Merksatz: „hasRole("ADMIN") mappt auf Authority ROLE_ADMIN."
Weiterlernen: Buchkapitel
Frage 48
Was macht PasswordEncoder in der Spring-Security-Authentication-Architektur?
- A) Mappt URLs auf Controller-Methoden
- B) Hasht und verifiziert Passwörter ohne Klartext-Speicherung
- C) Generiert automatisch JWT-Signing-Keys für alle Apps
- D) Ersetzt die Notwendigkeit von HTTPS
Antwort & Erklärung
Richtige Antwort: B
PasswordEncoder bietet One-Way-Encoding und matched Raw-Passwörter gegen gespeicherte Hashes bei der Authentifizierung. DelegatingPasswordEncoder unterstützt mehrere Algorithmen und ist der empfohlene Ansatz in modernem Spring Security.
Warum die anderen Optionen falsch sind:
- A) URL-Mapping ist MVC-Belang.
- C) JWT-Keys werden separat konfiguriert; PasswordEncoder handhabt Passwort-Hashing.
- D) Transport-Sicherheit braucht weiterhin TLS.
Merksatz: „Nie Klartext-Passwörter speichern; mit PasswordEncoder.matches verifizieren."
Weiterlernen: Buchkapitel
Frage 49
Eine browserbasierte App nutzt Cookie-Sessions und Form Login. Entwickler exponieren einen REST-POST-Endpoint, den dieselbe Origin konsumiert.
Warum ist CSRF-Schutz in dieser Anwendung relevant?
- A) Weil Browser Session-Cookies bei Cross-Site-Requests automatisch senden können und gefälschte state-changing Operationen ermöglichen, außer CSRF-Tokens werden validiert
- B) Weil JWT-Signaturen standardmäßig nach einer Sekunde ablaufen
- C) Weil @Transactional CSRF-Tokens braucht
- D) Weil CSRF Passwort-Hashing ersetzt
Antwort & Erklärung
Richtige Antwort: A
Session-Cookie-Authentifizierung ist anfällig für Cross-Site Request Forgery, wenn Browser Cookies automatisch anhängen. Spring-Security-CSRF-Tokens verifizieren beabsichtigte Client-Requests für state-changing Operationen in session-basierten Apps.
Warum die anderen Optionen falsch sind:
- B) JWT-Ablauf ist unabhängig von CSRF für Cookie-Session-Apps.
- C) Transaktionen sind Persistence-Belang.
- D) CSRF ersetzt keine Credential-Storage-Schutzmaßnahmen.
Merksatz: „Cookie-Session-Apps brauchen CSRF-Schutz bei state-changing Requests."
Weiterlernen: Buchkapitel
Frage 50
Welche Annotation aktiviert Method-Level-Security-Ausdrücke wie @PreAuthorize("hasAuthority('INVOICE_READ')")?
- A) @EnableMethodSecurity
- B) @EnableWebMvc
- C) @EnableJpaRepositories
- D) @EnableScheduling
Antwort & Erklärung
Richtige Antwort: A
@EnableMethodSecurity aktiviert Method-Interception für @PreAuthorize, @PostAuthorize, @Secured und verwandte Annotationen über Spring AOP um gesicherte Beans.
Warum die anderen Optionen falsch sind:
- B) @EnableWebMvc konfiguriert MVC-Infrastruktur, nicht Authorization auf Service-Methoden.
- C) @EnableJpaRepositories scannt nur Repository-Interfaces.
- D) @EnableScheduling aktiviert Scheduled-Task-Ausführung, unabhängig von Method Security.
Merksatz: „@EnableMethodSecurity schaltet @PreAuthorize und verwandte Checks ein."
Weiterlernen: Buchkapitel
Frage 51
Unit-Tests für OrderService sollen Geschäftslogik von Datenbank- und HTTP-Belangen isolieren.
Was ist das Hauptziel eines Spring-Service-Unit-Tests mit Mockito?
- A) Vollen Servlet-Container booten und echte Endpoints treffen
- B) Die Service-Klasse isoliert testen, indem Collaborators mit @ExtendWith(MockitoExtension.class) oder @Mock/@InjectMocks gemockt werden
- C) @SpringBootTest für jeden Service-Test verlangen
- D) Produktions-PostgreSQL für jede Testmethode laden
Antwort & Erklärung
Richtige Antwort: B
Unit-Tests fokussieren Verhalten einer Klasse, indem Abhängigkeiten durch Mocks ersetzt werden. Mockito integriert mit JUnit 5, um Interaktionen zu verifizieren und kontrollierte Antworten ohne Spring-Start zu liefern, wenn nicht nötig.
Warum die anderen Optionen falsch sind:
- A) Full-Container-Tests sind Integrationstests, keine Unit-Tests.
- C) @SpringBootTest ist schwerer als nötig für reine Unit-Tests.
- D) Produktionsdatenbanken machen Tests langsam und brüchig.
Merksatz: „Services mit Mocks unit-testen; Spring Context für Integrationstests reservieren."
Weiterlernen: Buchkapitel
Frage 52
Welche Annotation startet den vollen Spring-Application-Context inklusive Auto-Configuration für einen Integrationstest?
- A) @WebMvcTest
- B) @DataJpaTest
- C) Nur @MockBean ohne Context
- D) @SpringBootTest
Antwort & Erklärung
Richtige Antwort: D
@SpringBootTest lädt den kompletten Application Context (oder einen konfigurierten Slice über Attribute) und wird für Integrationstests genutzt, die echte Verdrahtung über Schichten brauchen — oft mit TestRestTemplate oder @Autowired-Collaborators.
Warum die anderen Optionen falsch sind:
- A) @WebMvcTest lädt nur MVC-Slice.
- B) @DataJpaTest lädt JPA-Slice typischerweise mit In-Memory-DB.
- C) @MockBean braucht einen Spring-Test-Context; es bootstrapped nicht allein.
Merksatz: „@SpringBootTest = vollständiger Integration-Context-Bootstrap."
Weiterlernen: Buchkapitel
Frage 53
Ein Controller-Test soll JSON-Response-Status und Body verifizieren, ohne einen echten Server auf zufälligem Port zu starten.
Welcher Test-Slice passt zum Testen eines @RestController mit MockMvc?
- A) @WebMvcTest(controllers = InvoiceController.class)
- B) Nur @SpringBootTest webEnvironment RANDOM_PORT
- C) @JdbcTest
- D) Nur @JsonTest für den gesamten MVC-Flow
Antwort & Erklärung
Richtige Antwort: A
@WebMvcTest konfiguriert Spring-MVC-Infrastruktur und MockMvc, begrenzt den Context auf Web-Layer-Beans und lässt dich Controller-Mappings, Statuscodes und JSON mit leichtem Setup testen.
Warum die anderen Optionen falsch sind:
- B) RANDOM_PORT funktioniert, ist aber schwerer als nötig für Controller-Slice-Tests.
- C) @JdbcTest zielt nur auf JDBC-Komponenten.
- D) @JsonTest fokussiert JSON-Serializer, nicht vollständiges Controller-Request-Mapping.
Merksatz: „@WebMvcTest plus MockMvc testet Controller ohne vollen Boot-Startup."
Weiterlernen: Buchkapitel
Frage 54
In einem @WebMvcTest muss eine Service-Abhängigkeit durch eine Mock-Implementierung ersetzt werden. Welche Annotation registriert den Mock im Test-Context?
- A) @MockBean
- B) Nur @Mock ohne Spring Context
- C) @Entity
- D) @Profile
Antwort & Erklärung
Richtige Antwort: A
@MockBean sagt Spring Test, einen Mockito-Mock als Bean im Application Context hinzuzufügen — bestehende Beans zu ersetzen oder zu ergänzen. Das ist nötig, wenn der getestete Controller Collaborators während @WebMvcTest autowiret.
Warum die anderen Optionen falsch sind:
- B) @Mock allein registriert keinen Bean im Spring-Test-ApplicationContext.
- C) @Entity ist eine JPA-Mapping-Annotation, kein Test-Mock-Registrierungsmechanismus.
- D) @Profile wählt Beans nach Umgebung; es erzeugt keine Mock-Implementierungen.
Merksatz: „@MockBean nutzen, um Mockito-Mocks in Spring-Test-Contexts zu injizieren."
Weiterlernen: Buchkapitel
Frage 55
Repository-Integrationstests sollen gegen eine In-Memory-Datenbank laufen mit nur geladenen JPA-Komponenten.
Welche Spring-Boot-Test-Annotation ist für JPA-Repository-Slice-Tests gedacht?
- A) @DataJpaTest
- B) @WebMvcTest
- C) Nur @SpringBootConfiguration
- D) @ControllerAdvice
Antwort & Erklärung
Richtige Antwort: A
@DataJpaTest konfiguriert JPA-bezogene Beans, typischerweise mit Embedded Database, und ist ideal zum Testen von Repository-Query-Methoden ohne die gesamte Anwendung zu laden.
Warum die anderen Optionen falsch sind:
- B) @WebMvcTest begrenzt den Context auf die Web-Schicht, nicht Repositories.
- C) @SpringBootConfiguration markiert eine Config-Klasse, definiert aber keinen Repository-Test-Slice.
- D) @ControllerAdvice ist für MVC-Exception Handling, nicht Repository-Integrationstests.
Merksatz: „@DataJpaTest lädt einen minimalen JPA-Test-Slice mit Embedded DB."
Weiterlernen: Buchkapitel
Frage 56
Was macht @Transactional auf einer Spring-Boot-Integrationstest-Methode typischerweise mit Datenbankänderungen während des Tests?
- A) Committet sie dauerhaft ins Produktionsschema
- B) Rollt nach dem Test standardmäßig zurück und hält Tests isoliert
- C) Deaktiviert die Datenbank komplett
- D) Führt den Test ohne DataSource aus
Antwort & Erklärung
Richtige Antwort: B
Spring-Test-Framework-Transaktionsunterstützung rollt Transaktionen nach jeder Testmethode standardmäßig zurück — das verhindert Testdaten-Verschmutzung und übt trotzdem echte transaktionale Codepfade.
Warum die anderen Optionen falsch sind:
- A) Default-Test-Transaktionen rollen zurück, nicht ins Produktionsschema committen.
- C) Der DataSource bleibt aktiv; transaktionale Tests nutzen ihn innerhalb einer zurückgerollten Transaktion.
- D) Integrationstests mit @Transactional brauchen weiterhin einen konfigurierten DataSource.
Merksatz: „Test-@Transactional-Methoden rollen standardmäßig für Isolation zurück."
Weiterlernen: Buchkapitel
Frage 57
Ein Logging-Aspect soll vor jeder public Methode im Service-Package laufen — aber nur auf Spring Beans.
Warum muss der Ziel-Service ein Spring-verwalteter Bean sein, damit Spring-AOP-Advice greift?
- A) Weil Advice über Proxies oder Subclass Weaving um vom Container erzeugte Beans angewendet wird
- B) Weil Java keine Methoden auf Klassen unterstützt
- C) Weil nur @Entity-Klassen geproxyt werden können
- D) Weil Aspects in application.properties kompiliert werden
Antwort & Erklärung
Richtige Antwort: A
Spring AOP wrappt Beans mit JDK-Dynamic-Proxies oder CGLIB-Subclasses, sodass Interceptors um Join Points laufen können. Mit new außerhalb des Containers erzeugte Objekte werden nicht geproxyt und umgehen daher Advice.
Warum die anderen Optionen falsch sind:
- B) Plain-Java-Methoden existieren; das Problem ist Proxy-Registrierung.
- C) Entities sind unabhängig von AOP-Proxy-Anforderungen.
- D) Aspects sind Beans/Advice-Definitionen, keine Property-Dateien.
Merksatz: „Spring AOP gilt für container-verwaltete Beans über Proxies."
Weiterlernen: Buchkapitel
Frage 58
SRE braucht einen Custom Counter für fehlgeschlagene Payment-Versuche über Actuator, kompatibel mit Prometheus-Scraping.
Welcher Spring-Boot-Ansatz registriert eine Custom Application Metric, die von Micrometer gesammelt und über Actuator exponiert wird?
@Service
public class PaymentService {
private final Counter failedPayments;
public PaymentService(MeterRegistry registry) {
this.failedPayments = registry.counter("payments.failed");
}
}
- A) Counter über MeterRegistry deklarieren und in Business-Code inkrementieren
- B) @Entity auf der Service-Klasse, damit JPA Metriken automatisch trackt
- C) Metrikwerte nur in statischer HashMap ohne MeterRegistry speichern
- D) management.endpoints.web.exposure deaktivieren, um Custom Metrics zu erzeugen
Antwort & Erklärung
Richtige Antwort: A
Spring-Boot-Actuator integriert Micrometer, sodass Beans Counter, Timer und Gauges über MeterRegistry registrieren können. Diese Meter erscheinen auf /actuator/metrics und können nach Prometheus exportiert werden, wenn Registry und Exporter konfiguriert sind.
Warum die anderen Optionen falsch sind:
- B) JPA-Entity-Mapping hat keinen Bezug zu Application-Metrics-Registrierung.
- C) Ad-hoc-statische Maps sind nicht mit Actuator-Endpoints oder standardisierten Metric Registries integriert.
- D) Actuator-Endpoints verstecken verhindert Observability statt Custom Metrics zu ermöglichen.
Merksatz: „Custom Metrics mit MeterRegistry registrieren; Actuator exponiert sie über Micrometer."
Weiterlernen: Buchkapitel
Frage 59
Wenn eine Bestellung aufgegeben wird, müssen mehrere Module reagieren: E-Mail senden, Inventar aktualisieren, auditieren. Der Order Service soll auf Persistenz fokussiert bleiben.
Welches Spring-Feature entkoppelt Side Effects, indem Listener benachrichtigt werden, wenn OrderCreatedEvent publiziert wird?
publisher.publishEvent(new OrderCreatedEvent(orderId));
@EventListener
void onOrderCreated(OrderCreatedEvent event) { emailService.sendReceipt(event); }
- A) Gesamte Logik in eine riesige @Transactional-Methode mit switch-cases packen
- B) Statischen Singleton-Event-Bus außerhalb von Spring nutzen
- C) ApplicationEventPublisher und @EventListener-Methoden
- D) Den ApplicationContext deaktivieren
Antwort & Erklärung
Richtige Antwort: C
Spring Application Events lassen einen Publisher Domain Events emittieren und Listener synchron oder asynchron über @EventListener reagieren. Das hält den Kern-Workflow zusammenhängend, während Erweiterbarkeit in Listenern lebt.
Warum die anderen Optionen falsch sind:
- A) Eine monolithische Methode koppelt Side Effects eng und schadet der Wartbarkeit.
- B) Ein statischer Bus umgeht Spring-Lifecycle und Testbarkeitsvorteile.
- D) Context deaktivieren entfernt die Event-Infrastruktur komplett.
Merksatz: „Domain Events publizieren; Side Effects mit @EventListener behandeln."
Weiterlernen: Buchkapitel
Frage 60
Welche Konfiguration aktiviert Spring-@Async-Methodenausführung mit einem Task Executor?
@Configuration
@EnableAsync
class AsyncConfig { }
- A) Nur @EnableWebMvc
- B) Nur @EntityScan
- C) Nur @RefreshScope
- D) @EnableAsync auf einer @Configuration-Klasse
Antwort & Erklärung
Richtige Antwort: D
@EnableAsync aktiviert die Verarbeitung von @Async-Methoden über Spring AOP und TaskExecutor-Infrastruktur. Ohne es laufen @Async-Methoden synchron auf dem Caller-Thread.
Warum die anderen Optionen falsch sind:
- A) @EnableWebMvc konfiguriert Web MVC, nicht asynchrone Methodenausführung.
- B) @EntityScan begrenzt JPA-Entity-Scanning auf angegebene Packages.
- C) @RefreshScope ist ein Spring-Cloud-Scope für refreshed Configuration Beans.
Merksatz: „@EnableAsync schaltet asynchrone @Async-Methodenbehandlung ein."
Weiterlernen: Buchkapitel
Ende von Mock Full 01 — Spring Professional (60 Fragen)