Mock Full 05 — 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 Team registriert eine Utility-Klasse mit new im Controller, statt sie von Spring zu injizieren.
Warum nimmt das manuell erzeugte Utility nicht an Dependency Injection teil?
- A) Nur @Repository-Klassen können injizierte Collaborators erhalten
- B) Mit
newerzeugte Objekte werden vom IoC-Container nicht verwaltet, sofern sie nicht explizit als Beans registriert sind - C) Der Controller-Scope verhindert die Verdrahtung von Hilfsobjekten
- D) Spring injiziert Abhängigkeiten nur in statische Methoden
Antwort & Erklärung
Richtige Antwort: B
Spring Dependency Injection gilt für Objekte, die der Container erzeugt und verwaltet. new umgeht die Bean-Registrierung — es gibt keine Injection, keine Lifecycle-Callbacks und kein Proxying für diese Instanz.
Warum die anderen Optionen falsch sind:
- A) Jede Stereotyp-Annotation oder @Bean kann injiziert werden, nicht nur Repositories.
- C) Der Controller-Scope blockiert nicht die Injection in korrekt registrierte Beans.
- D) Spring injiziert in normaler Nutzung nicht in statische Methoden.
Merksatz: „new() erzeugt Nicht-Beans; nur container-verwaltete Objekte bekommen DI."
Weiterlernen: Buchkapitel
Frage 2
Wie hängen Inversion of Control (IoC) und Dependency Injection (DI) zusammen?
- A) DI ersetzt IoC in modernem Spring vollständig
- B) IoC ist das Prinzip; DI ist eine gängige Technik zur Umsetzung von IoC
- C) IoC gilt nur für Webanwendungen; DI nur für Batch-Jobs
- D) Es sind unabhängige Konzepte, die zufällig dieselben Annotationen teilen
Antwort & Erklärung
Richtige Antwort: B
IoC bedeutet, dass die Kontrolle über Objekterzeugung und Verdrahtung an einen Container umgekehrt wird. DI ist ein Weg, IoC umzusetzen, indem Abhängigkeiten von außen geliefert werden, statt dass die Klasse sie selbst konstruiert.
Warum die anderen Optionen falsch sind:
- A) DI ersetzt IoC nicht; es setzt die IoC-Idee um.
- C) Beide Konzepte gelten für alle Anwendungstypen.
- D) Sie sind direkt verwandte Grundkonzepte von Spring.
Merksatz: „IoC ist die Idee; DI ist, wie Spring sie meist umsetzt."
Weiterlernen: Buchkapitel
Frage 3
Wie viele PaymentGateway-Collaborators injiziert Spring in diesen einzigen öffentlichen Konstruktor?
@Component
public class OrderRouter {
@Autowired
public OrderRouter(PaymentGateway gateway) { }
}
- A) Keine, weil @Autowired an jedem Konstruktorparameter erforderlich ist
- B) Ein passender PaymentGateway-Bean aus dem Container
- C) Alle PaymentGateway-Beans automatisch als List
- D) Eine neue PaymentGateway-Instanz pro HTTP-Request unabhängig vom Scope
Antwort & Erklärung
Richtige Antwort: B
Bei einem einzigen Konstruktor behandelt Spring 4.3+ ihn als Autowiring-Konstruktor, auch ohne @Autowired. Ein kompatibler PaymentGateway-Bean wird injiziert, sofern nicht mehrere Kandidaten @Qualifier erfordern.
Warum die anderen Optionen falsch sind:
- A) @Autowired ist bei einem einzigen Konstruktor optional.
- C) Mehrere Beans erfordern explizite Collection-Injection oder Qualifier-Handling.
- D) Request-Scope folgt nicht aus Konstruktor-Injection.
Merksatz: „Einzelner Konstruktor = in Spring standardmäßig autowired."
Weiterlernen: Buchkapitel
Frage 4
Welche Stereotyp-Annotation passt am besten für eine Klasse, die Persistenz-Exceptions in die Spring-DataAccessException-Hierarchie übersetzt?
- A) @Service
- B) @Repository
- C) @Controller
- D) @Configuration
Antwort & Erklärung
Richtige Antwort: B
@Repository markiert die Persistenzschicht und aktiviert PersistenceExceptionTranslationPostProcessor zur Umwandlung von Vendor-Exceptions in Spring-Datenzugriffs-Exceptions.
Warum die anderen Optionen falsch sind:
- A) @Service ist für Business-Logik, nicht für Persistenz-Exception-Translation.
- C) @Controller dispatcht Web-Requests.
- D) @Configuration definiert Bean-Factories, keine DAO-/Repository-Rolle.
Merksatz: „@Repository = Persistenzschicht plus Exception-Translation."
Weiterlernen: Buchkapitel
Frage 5
Was fügt @RestController im Vergleich zu @Controller allein hinzu?
@RestController
public class InvoiceController { }
// vs
@Controller
public class InvoicePageController { }
- A) @ResponseBody-Semantik auf Handler-Methoden, sodass Rückgabewerte direkt in den HTTP-Body geschrieben werden
- B) Automatisches Transaction Management auf jedem Handler
- C) Obligatorische CSRF-Token-Validierung auf allen Endpoints
- D) Prototype-Scope für den Controller-Bean
Antwort & Erklärung
Richtige Antwort: A
@RestController ist eine zusammengesetzte Annotation aus @Controller und @ResponseBody — Rückgabewerte werden über HttpMessageConverters serialisiert statt über View Resolution.
Warum die anderen Optionen falsch sind:
- B) Transaktionen werden nicht durch @RestController aktiviert.
- C) CSRF ist ein Security-Thema, nicht Teil von @RestController.
- D) Controller bleiben standardmäßig Singleton.
Merksatz: „@RestController = @Controller + @ResponseBody."
Weiterlernen: Buchkapitel
Frage 6
Ein Bean ist mit Scope singleton (Standard) deklariert. Was bedeutet Singleton in Spring?
- A) Eine Instanz pro HTTP-Session
- B) Eine Instanz pro JVM global über alle Anwendungen
- C) Eine gemeinsame Instanz pro Spring-IoC-Container
- D) Eine Instanz pro Thread
Antwort & Erklärung
Richtige Antwort: C
Spring Singleton-Scope bedeutet eine Bean-Instanz pro Container — nicht global pro Class Loader oder pro Thread. Das ist der Standard für die meisten Beans.
Warum die anderen Optionen falsch sind:
- A) Session-Scope erzeugt eine Instanz pro HTTP-Session.
- B) Mehrere Spring-Contexts in einer JVM haben jeweils ihre eigene Singleton-Instanz.
- D) Thread-Scope ist separat und nicht der Standard.
Merksatz: „Spring Singleton = eine Instanz pro Container."
Weiterlernen: Buchkapitel
Frage 7
Der Startup schlägt mit NoUniqueBeanDefinitionException für DataExporter fehl, wenn zwei Implementierungen existieren.
Welche Annotation markiert einen Bean als Standard bei Autowiring nach Typ?
- A) @Order
- B) @Primary
- C) @DependsOn
- D) @Lazy
Antwort & Erklärung
Richtige Antwort: B
@Primary wählt einen bevorzugten Bean, wenn mehrere Kandidaten für einen Injection Point nach Typ passen. Andere Consumer können weiterhin @Qualifier für einen Nicht-Primary-Bean nutzen.
Warum die anderen Optionen falsch sind:
- A) @Order beeinflusst Reihenfolge von Listen oder Advice, nicht Autowire-Präferenz.
- C) @DependsOn steuert Initialisierungsreihenfolge.
- D) @Lazy verzögert Erzeugung, löst aber keine Mehrdeutigkeit.
Merksatz: „Typ-Mehrdeutigkeit → @Primary auf dem bevorzugten Bean."
Weiterlernen: Buchkapitel
Frage 8
Was bewirkt @ComponentScan auf einer @Configuration-Klasse beim Context Refresh?
@Configuration
@ComponentScan(basePackages = "com.example.billing")
public class BillingConfig { }
- A) Nur @Bean-Methoden in BillingConfig werden verarbeitet
- B) Classpath-Scanning registriert stereotyp-annotierte Klassen unter com.example.billing als Bean-Definitionen
- C) Alle Klassen auf dem JVM-Classpath werden automatisch Beans
- D) Component Scanning läuft nur im Production-Profil
Antwort & Erklärung
Richtige Antwort: B
@ComponentScan weist den Container an, die angegebenen Packages nach @Component, @Service, @Repository, @Controller und anderen Stereotypen zu scannen und sie als Beans zu registrieren.
Warum die anderen Optionen falsch sind:
- A) @Bean-Methoden werden separat vom Scanning verarbeitet.
- C) Nur annotierte Klassen in gescannten Packages werden registriert.
- D) Scanning ist nicht profilgebunden, sofern nicht so konfiguriert.
Merksatz: „@ComponentScan registriert annotierte Klassen in den angegebenen Packages."
Weiterlernen: Buchkapitel
Frage 9
BeanFactory versus ApplicationContext: Welche Fähigkeit ist typischerweise mit ApplicationContext verbunden, nicht aber mit dem minimalen BeanFactory-Vertrag?
- A) Beans nach Name abrufen
- B) ApplicationEvents an Listener publizieren
- C) Singleton- versus Prototype-Scope prüfen
- D) Bean-Referenzen nach Typ holen
Antwort & Erklärung
Richtige Antwort: B
ApplicationContext erweitert BeanFactory und fügt Event-Propagation, MessageSource, Resource-Loading-Hilfen und automatische BeanPostProcessor-Registrierung beim Refresh hinzu.
Warum die anderen Optionen falsch sind:
- A) Bean-Abruf existiert auf BeanFactory.
- C) Scope-Inspektion ist auf BeanFactory verfügbar.
- D) Typbasiertes Lookup ist eine BeanFactory-Fähigkeit.
Merksatz: „ApplicationContext ergänzt Events, i18n und reichere Container-Integration."
Weiterlernen: Buchkapitel
Frage 10
Warum wird Field Injection wie hier in Spring-Anwendungen abgeraten?
@Service
public class PricingService {
@Autowired
private DiscountPolicy discountPolicy;
}
- A) Sie verhindert, dass die Klasse geproxied wird
- B) Sie verbirgt erforderliche Abhängigkeiten, erschwert Tests und erlaubt keine einfache Unveränderlichkeit
- C) Sie funktioniert nur mit XML-Konfiguration
- D) Sie deaktiviert Component Scanning für die Klasse
Antwort & Erklärung
Richtige Antwort: B
Field Injection macht Abhängigkeiten weniger sichtbar, erschwert Unit-Tests ohne Reflection oder Spring und ist mit finalen unveränderlichen Feldern inkompatibel. Konstruktor-Injection ist für erforderliche Collaborators bevorzugt.
Warum die anderen Optionen falsch sind:
- A) Proxies können field-injizierte Beans weiterhin wrappen.
- C) Field Injection funktioniert mit Annotation Config.
- D) Component Scanning ist unbetroffen.
Merksatz: „Konstruktor-Injection bevorzugen; Field Injection verbirgt Abhängigkeiten."
Weiterlernen: Buchkapitel
Frage 11
Was erzeugt die @Bean-Methode im Spring-Container?
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
- A) Eine statische Utility-Klasse, nur nach Name registriert
- B) Eine Bean-Instanz, deren Lifecycle der Container verwaltet
- C) Einen Prototype-Controller, der auf /restTemplate gemappt ist
- D) Einen Property-Placeholder aus application.yml
Antwort & Erklärung
Richtige Antwort: B
@Bean-Methoden sind Factory-Methoden, die von Configuration-Class-Enhancement verarbeitet werden. Der Rückgabewert wird als Bean mit container-verwaltetem Lifecycle und Injection-Support registriert.
Warum die anderen Optionen falsch sind:
- A) Der Rückgabewert ist ein verwalteter Bean, kein reiner Name-Alias.
- C) @Bean erzeugt keine Web-Endpoints.
- D) Property-Placeholders nutzen @Value oder @ConfigurationProperties.
Merksatz: „Rückgabewert einer @Bean-Methode wird ein Spring-verwalteter Bean."
Weiterlernen: Buchkapitel
Frage 12
Eine @Configuration-Klasse definiert zwei @Bean-Methoden, wobei eine die andere aufruft. Warum können beide Aufrufe dieselbe Instanz zurückgeben?
- A) @Configuration-Klassen werden enhanced, sodass @Bean-Methoden geproxied werden und Singleton-Semantik innerhalb der Klasse gilt
- B) Die JVM cached alle Methodenrückgabewerte global
- C) Spring nutzt immer Prototype-Scope für @Bean-Methoden
- D) @Bean-Methoden dürfen sich nicht gegenseitig aufrufen
Antwort & Erklärung
Richtige Antwort: A
Full-@Configuration-Mode proxied @Bean-Methoden, sodass Intra-Class-Aufrufe über den Container laufen und Singleton-Beans nicht versehentlich doppelt erzeugt werden.
Warum die anderen Optionen falsch sind:
- B) Die JVM cached nicht global beliebige Methodenrückgaben.
- C) Standard-@Bean-Scope ist Singleton, sofern nicht anders angegeben.
- D) @Bean-Methoden können sich aufrufen; Proxying ist das Schlüsselverhalten.
Merksatz: „@Configuration proxied @Bean-Methoden, um doppelte Singletons zu vermeiden."
Weiterlernen: Buchkapitel
Frage 13
Wie entscheidet Spring, welcher PaymentClient-Bean aktiv ist?
@Bean
@Profile("staging")
public PaymentClient stagingClient() { return new StagingClient(); }
@Bean
@Profile("production")
public PaymentClient productionClient() { return new ProductionClient(); }
- A) Beide Beans werden immer geladen und @Primary wählt einen
- B) Nur der Bean, dessen @Profile zu aktiven Profilen passt, wird registriert
- C) Profile werden für @Bean-Methoden ignoriert
- D) Der zuletzt deklarierte @Bean gewinnt immer
Antwort & Erklärung
Richtige Antwort: B
@Profile registriert Bean-Definitionen bedingt. Nur Profile, die zu spring.profiles.active (oder Äquivalent) passen, machen den Bean im Context verfügbar.
Warum die anderen Optionen falsch sind:
- A) Nicht passende Profil-Beans werden nicht registriert — typischerweise keine Mehrdeutigkeit.
- C) Profile gelten vollständig für @Bean-Definitionen.
- D) Deklarationsreihenfolge überschreibt keine Profilbedingungen.
Merksatz: „@Profile registriert Beans nur, wenn das Profil aktiv ist."
Weiterlernen: Buchkapitel
Frage 14
Was ist der Hauptzweck von @ConfigurationProperties auf einer typsicheren Properties-Klasse?
- A) SQL aus Property-Keys generieren
- B) Externe Konfiguration unter einem Prefix an Java-Objektfelder binden
- C) @ComponentScan ersetzen
- D) Method Security auf Configuration-Klassen aktivieren
Antwort & Erklärung
Richtige Antwort: B
@ConfigurationProperties bindet Environment-Properties mit einem Prefix an Felder oder Konstruktorparameter einer Klasse — validierter, typsicherer Konfigurationszugriff.
Warum die anderen Optionen falsch sind:
- A) Es generiert kein SQL.
- C) Component Scanning ist unabhängig.
- D) Security-Annotationen sind separat.
Merksatz: „@ConfigurationProperties = Prefix-Properties an eine Klasse binden."
Weiterlernen: Buchkapitel
Frage 15
Was bedeutet die :30-Syntax in diesem @Value-Ausdruck?
@Value("${app.timeout:30}")
private int timeout;
- A) Eine Pflicht-Property, deren Fehlen den Startup abbricht
- B) Ein Default-Wert 30, wenn app.timeout nicht gesetzt ist
- C) Ein automatisch aktiviertes Profil
- D) Eine SpEL-Arithmetikoperation
Antwort & Erklärung
Richtige Antwort: B
Der Doppelpunkt in $\{property:default\} liefert einen Fallback, wenn die Property fehlt. Das ist Property-Placeholder-Auflösung, keine Profilaktivierung.
Warum die anderen Optionen falsch sind:
- A) Pflicht-Properties ohne Default führen bei Fehlen zum Abbruch.
- C) Profile nutzen @Profile oder spring.profiles.active.
- D) Das ist kein SpEL, außer in
#{...}gewrappt.
Merksatz: „${key:default} = Property mit Fallback-Default."
Weiterlernen: Buchkapitel
Frage 16
Ein Singleton-Service injiziert einen Prototype-Formatter-Bean direkt. Was passiert?
- A) Bei jedem Methodenaufruf wird automatisch ein neuer Formatter erzeugt
- B) Der Singleton hält eine Formatter-Instanz für seine Lebensdauer, sofern kein Scoped Proxy oder ObjectProvider genutzt wird
- C) Prototype-Scope wird still zu Singleton hochgestuft
- D) Injection schlägt beim Startup immer fehl
Antwort & Erklärung
Richtige Antwort: B
Prototype-Beans in Singletons werden einmal bei Singleton-Erzeugung aufgelöst. Für Instanzen pro Nutzung: @Lookup, ObjectProvider oder Scoped Proxies.
Warum die anderen Optionen falsch sind:
- A) Direkte Injection erzeugt den Prototype nicht bei jedem Methodenaufruf neu.
- C) Scopes werden nicht still hochgestuft.
- D) Injection gelingt, das Verhalten kann aber für per-Operation-Prototypes falsch sein.
Merksatz: „Prototype im Singleton = eine Instanz, außer mit ObjectProvider oder Proxy."
Weiterlernen: Buchkapitel
Frage 17
Warum wird proxyMode = TARGET_CLASS auf diesem Request-Scoped-Bean genutzt?
@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public UserContext userContext() { return new UserContext(); }
- A) Damit ein Singleton-Collaborator einen Proxy injizieren kann, der an die aktuelle Request-Instanz delegiert
- B) Um den Bean zum Singleton zu machen
- C) Um Dependency Injection zu deaktivieren
- D) Um den Bean auf einem Hintergrundthread auszuführen
Antwort & Erklärung
Richtige Antwort: A
Scoped Proxies erlauben kürzer lebende Beans (Request/Session) in länger lebende Singletons zu injizieren. Der Proxy löst die korrekte Instanz pro Request auf.
Warum die anderen Optionen falsch sind:
- B) Der Scope bleibt Request; der Proxy ändert ihn nicht zu Singleton.
- C) Injection funktioniert über den Proxy.
- D) Proxy-Mode ist unabhängig von Async-Threading.
Merksatz: „Scoped Proxy lässt Singletons Request-/Session-Beans sicher nutzen."
Weiterlernen: Buchkapitel
Frage 18
Welches Callback-Interface erlaubt einem Bean, eigene Logik auszuführen, nachdem alle Properties gesetzt sind?
- A) BeanFactoryPostProcessor
- B) InitializingBean oder @PostConstruct-Methoden
- C) Nur BeanDefinitionRegistryPostProcessor
- D) ApplicationListener bedingungslos für jeden Bean
Antwort & Erklärung
Richtige Antwort: B
InitializingBean.afterPropertiesSet, custom Init-Methoden und @PostConstruct laufen nach abgeschlossener Dependency Injection und bevor der Bean genutzt wird.
Warum die anderen Optionen falsch sind:
- A) BeanFactoryPostProcessor ändert Bean-Definitionen vor Instanziierung.
- C) Registry Post-Processors arbeiten bei Definition-Registrierung.
- D) ApplicationListener ist für Events, nicht generisches Init jedes Beans.
Merksatz: „Nach Properties setzen → @PostConstruct oder InitializingBean."
Weiterlernen: Buchkapitel
Frage 19
Welche drei Annotationen setzt @SpringBootApplication zusammen?
- A) @Configuration, @EnableAutoConfiguration und @ComponentScan
- B) @SpringBootConfiguration, @EnableWebMvc und nur @EntityScan
- C) @Controller, @Service und @Repository
- D) @Import, @PropertySource und @Profile
Antwort & Erklärung
Richtige Antwort: A
@SpringBootApplication kombiniert @Configuration, @EnableAutoConfiguration und @ComponentScan (mit optionalen Attributen). Es ist der Einstiegspunkt für Boot Auto-Config und Component Discovery.
Warum die anderen Optionen falsch sind:
- B) @EnableWebMvc optiert aus Boot-MVC-Auto-Config; nicht Teil der Standard-Triade.
- C) Das sind Stereotypen, keine Meta-Annotationen von @SpringBootApplication.
- D) Diese Annotationen gehören nicht zur Zusammensetzung.
Merksatz: „@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan."
Weiterlernen: Buchkapitel
Frage 20
Was ist die Hauptrolle eines Spring-Boot-Starters wie spring-boot-starter-web?
- A) Er definiert direkt jeden Bean in der Anwendung
- B) Er bringt ein kuratiertes Set transitiver Dependencies für einen Feature-Bereich
- C) Er ersetzt application.properties
- D) Er deaktiviert Component Scanning
Antwort & Erklärung
Richtige Antwort: B
Starter sind Dependency-Deskriptoren, die kompatible Libraries auf den Classpath holen. Auto-Configuration erzeugt dann Beans, wenn Bedingungen passen.
Warum die anderen Optionen falsch sind:
- A) Beans kommen aus User-Code und Auto-Config, nicht aus dem Starter-POM selbst.
- C) Properties bleiben separate Konfiguration.
- D) Scanning steuert @SpringBootApplication.
Merksatz: „Starter = Dependency-Bundle; Auto-Config = bedingte Beans."
Weiterlernen: Buchkapitel
Frage 21
Ein custom DataSource-@Bean existiert bereits. Wie wirkt @ConditionalOnMissingBean auf die auto-konfigurierte DataSource-Erzeugung?
- A) Boot erzeugt trotzdem eine zweite DataSource
- B) Auto-Configuration tritt zurück und registriert keinen Default-DataSource-Bean
- C) Der User-Bean wird gelöscht
- D) User-Beans außerhalb des @SpringBootApplication-Packages werden ignoriert
Antwort & Erklärung
Richtige Antwort: B
@ConditionalOnMissingBean verhindert, dass Auto-Config einen Bean registriert, wenn der User bereits einen dieses Typs definiert hat — keine doppelten Primary-Beans.
Warum die anderen Optionen falsch sind:
- A) Back-off vermeidet doppelte Beans.
- C) User-Beans bleiben erhalten.
- D) Package-Location befreit Beans nicht von Condition-Evaluation.
Merksatz: „OnMissingBean = Auto-Config tritt zurück, wenn User-Bean existiert."
Weiterlernen: Buchkapitel
Frage 22
Wie kann ein Entwickler prüfen, welche Auto-Configuration-Klassen beim Startup gematcht haben oder nicht?
debug=true
# or
logging.level.org.springframework.boot.autoconfigure=DEBUG
- A) Nur durch Dekompilieren der Spring-Boot-JARs
- B) Debug-Logging aktivieren oder /actuator/conditions nutzen, wenn exponiert
- C) Auto-Configuration-Entscheidungen sind nicht beobachtbar
- D) @EnableWebMvc hinzufügen, um den Report zu drucken
Antwort & Erklärung
Richtige Antwort: B
Boot kann einen Conditions-Evaluation-Report drucken, wenn debug aktiv ist. Actuator exponiert /actuator/conditions für denselben Einblick in laufenden Apps.
Warum die anderen Optionen falsch sind:
- A) Eingebautes Reporting existiert ohne Dekompilierung.
- C) Conditions werden explizit geloggt oder über Actuator exponiert.
- D) @EnableWebMvc ändert MVC-Config, nicht Condition-Reporting.
Merksatz: „Auto-Config debuggen mit debug=true oder Actuator /conditions."
Weiterlernen: Buchkapitel
Frage 23
spring-boot-starter-data-jpa ist auf dem Classpath, aber keine Database-Driver-Dependency ist deklariert. Was ist typisch?
- A) Hibernate verbindet automatisch mit einer eingebetteten Default-Produktionsdatenbank
- B) Die Anwendung schlägt beim Startup fehl, weil ohne unterstützten Driver keine DataSource erzeugt werden kann
- C) JPA funktioniert ohne Datenbank
- D) Nur @WebMvcTest-Contexts sind betroffen
Antwort & Erklärung
Richtige Antwort: B
Der JPA-Starter liefert JPA/Hibernate-Support, aber keine Vendor-Driver. Ohne Driver (oder explizite DataSource-Config) kann DataSource-Auto-Configuration nicht erfolgreich sein.
Warum die anderen Optionen falsch sind:
- A) Es gibt keine implizite Produktionsdatenbank.
- C) JPA benötigt in typischen Setups eine DataSource.
- D) Das betrifft den Haupt-ApplicationContext, nicht nur Web-Slice-Tests.
Merksatz: „JPA-Starter braucht eine Database-Driver-Dependency."
Weiterlernen: Buchkapitel
Frage 24
Welche Property steuert üblicherweise, welche Actuator-Endpoints über HTTP exponiert werden?
- A) management.endpoints.web.exposure.include
- B) server.servlet.context-path.only
- C) spring.jpa.show-sql
- D) logging.pattern.console
Antwort & Erklärung
Richtige Antwort: A
management.endpoints.web.exposure.include (und exclude) bestimmt, welche Actuator-Endpoints auf dem Web-Port verfügbar sind — z. B. health, info, metrics.
Warum die anderen Optionen falsch sind:
- B) Context Path beeinflusst URL-Prefix, nicht Endpoint-Auswahl.
- C) show-sql ist JPA-Logging, nicht Actuator.
- D) Logging-Pattern ist unabhängig von Endpoint-Exposure.
Merksatz: „Actuator-Endpoints exponieren via management.endpoints.web.exposure.include."
Weiterlernen: Buchkapitel
Frage 25
Was steuert diese Einstellung?
management.endpoint.health.show-details=when_authorized
- A) Ob Health-Details immer öffentlich erscheinen
- B) Health-Detail-Sichtbarkeit nur für autorisierte Actuator-Requests, wenn konfiguriert
- C) SQL-Logging für Health-Checks
- D) Deaktiviert den Health-Endpoint vollständig
Antwort & Erklärung
Richtige Antwort: B
show-details regelt, wie viel Health-Information zurückgegeben wird. when_authorized verbirgt sensible Details vor anonymen Aufrufern und erlaubt autorisierten Nutzern mehr Detail.
Warum die anderen Optionen falsch sind:
- A) always würde Details öffentlich zeigen; diese Einstellung ist restriktiver.
- C) SQL-Logging ist separat.
- D) Der Endpoint bleibt verfügbar; nur die Detail-Sichtbarkeit ändert sich.
Merksatz: „health show-details steuert, wie viel Health-Info Aufrufer sehen."
Weiterlernen: Buchkapitel
Frage 26
Wann laufen CommandLineRunner-Beans in der Boot-Startup-Sequenz?
- A) Bevor der ApplicationContext erzeugt wird
- B) Nachdem der Context refreshed ist und die Anwendung gestartet hat
- C) Nur bei HTTP-Request-Ankunft
- D) Nur wenn Actuator /health aufgerufen wird
Antwort & Erklärung
Richtige Antwort: B
CommandLineRunner und ApplicationRunner laufen nach Context Refresh beim Anwendungsstart — nützlich zum Seeden von Daten oder Validieren der Konfiguration.
Warum die anderen Optionen falsch sind:
- A) Der Context muss zuerst existieren.
- C) Das sind Startup-Hooks, keine Request-Handler.
- D) Actuator-Health-Checks triggern keine Runner.
Merksatz: „CommandLineRunner läuft nach Context Refresh beim Startup."
Weiterlernen: Buchkapitel
Frage 27
Wie ändert spring.main.lazy-initialization=true die Bean-Erzeugung?
- A) Alle Beans werden nie erzeugt
- B) Singleton-Beans werden bei erstem Bedarf erzeugt statt eager beim Refresh
- C) Nur Prototype-Beans werden lazy
- D) Es deaktiviert Auto-Configuration
Antwort & Erklärung
Richtige Antwort: B
Lazy Initialization verzögert Singleton-Erzeugung bis zur ersten Abhängigkeit — schnellerer Startup, aber verzögerte Fehlererkennung.
Warum die anderen Optionen falsch sind:
- A) Beans werden bei Bedarf weiterhin erzeugt.
- C) Die Einstellung betrifft primär eager Singleton-Init.
- D) Auto-Configuration läuft weiter.
Merksatz: „lazy-initialization = Singleton-Beans bei erster Nutzung erzeugen."
Weiterlernen: Buchkapitel
Frage 28
Wo sind Auto-Configuration-Klassen in Spring Boot 3 für Imports gelistet?
- A) Nur META-INF/spring.factories
- B) META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
- C) WEB-INF/web.xml
- D) application.yml spring.auto.import-Abschnitt
Antwort & Erklärung
Richtige Antwort: B
Boot 3 hat Auto-Configuration-Registrierung nach AutoConfiguration.imports unter META-INF/spring/ verschoben — Ersatz für spring.factories bei Auto-Config.
Warum die anderen Optionen falsch sind:
- A) spring.factories ist Boot-2-Stil für Auto-Config.
- C) web.xml wird nicht für Boot Auto-Config-Registrierung genutzt.
- D) Kein solcher Standard-application.yml-Abschnitt registriert Auto-Config-Klassen.
Merksatz: „Boot 3 Auto-Config-Imports-Datei unter META-INF/spring/."
Weiterlernen: Buchkapitel
Frage 29
Welche Rolle hat DispatcherServlet in Spring MVC?
- A) Kompiliert nur JSP-Dateien
- B) Front Controller, der Requests an Handler dispatcht und View Resolution oder Message Conversion koordiniert
- C) Ersetzt den IoC-Container
- D) Verwaltet Datenbanktransaktionen direkt
Antwort & Erklärung
Richtige Antwort: B
DispatcherServlet ist der Front Controller: Er mappt Requests via HandlerMapping, ruft Controller auf und löst Views auf oder schreibt Bodies über HttpMessageConverters.
Warum die anderen Optionen falsch sind:
- A) JSP-Kompilierung ist container-spezifisch, nicht Kernrolle von DispatcherServlet.
- C) ApplicationContext bleibt separat.
- D) Transaktionen übernimmt Transaction Infrastructure, nicht DispatcherServlet.
Merksatz: „DispatcherServlet = Front Controller für Spring MVC."
Weiterlernen: Buchkapitel
Frage 30
Welche Annotation bindet das {id}-URI-Segment an den Methodenparameter?
@GetMapping("/orders/{id}")
public OrderDto get(@PathVariable Long id) { }
- A) @RequestParam
- B) @PathVariable
- C) @RequestBody
- D) Nur @MatrixVariable
Antwort & Erklärung
Richtige Antwort: B
@PathVariable mappt URI-Template-Variablen aus dem Pfad auf Handler-Methodenargumente.
Warum die anderen Optionen falsch sind:
- A) @RequestParam bindet Query-Parameter.
- C) @RequestBody bindet den HTTP-Body.
- D) @MatrixVariable behandelt Matrix-Parameter, nicht Standard-{id}-Pfade.
Merksatz: „URI-Template-Variablen → @PathVariable."
Weiterlernen: Buchkapitel
Frage 31
Was löst @Valid hier aus?
@PostMapping("/orders")
public ResponseEntity<OrderDto> create(@Valid @RequestBody CreateOrderRequest request) { }
- A) Nur Datenbank-Constraint-Validierung
- B) Bean Validation (Jakarta Validation) auf den Feldern des Request-Objekts
- C) CSRF-Token-Verifikation
- D) Automatische URL-Kodierung
Antwort & Erklärung
Richtige Antwort: B
@Valid triggert JSR-380-Validatoren auf dem Request-DTO. Verletzungen werden typischerweise zu 400-Responses mit @ControllerAdvice Exception Handling.
Warum die anderen Optionen falsch sind:
- A) JPA-Validierung ist getrennt von MVC-Request-Validierung.
- C) CSRF ist Aufgabe des Security-Filters.
- D) URL-Kodierung ist unabhängig.
Merksatz: „@Valid auf @RequestBody triggert Bean Validation am DTO."
Weiterlernen: Buchkapitel
Frage 32
Ein Handler wirft MethodArgumentNotValidException. Wo sollte sie in eine konsistente JSON-Fehlerantwort übersetzt werden?
- A) @ControllerAdvice mit @ExceptionHandler
- B) Nur in jedem Controller mit try/catch
- C) Nur web.xml error-page-Einträge
- D) application.properties
Antwort & Erklärung
Richtige Antwort: A
@ControllerAdvice zentralisiert Exception Handling über Controller hinweg und mappt Validierungs- und Business-Exceptions auf konsistente HTTP-Responses.
Warum die anderen Optionen falsch sind:
- B) try/catch pro Controller dupliziert Logik.
- C) Boot-Apps nutzen @ControllerAdvice statt web.xml für REST-Fehler.
- D) Properties definieren kein Exception Mapping.
Merksatz: „Zentrale REST-Fehler → @ControllerAdvice + @ExceptionHandler."
Weiterlernen: Buchkapitel
Frage 33
Wie nutzt Spring MVC @ResponseStatus auf einer Custom Exception?
@ResponseStatus(HttpStatus.NOT_FOUND)
public class OrderNotFoundException extends RuntimeException { }
- A) Wird ignoriert, außer die Exception erweitert Exception
- B) Kann die Exception einem HTTP-Status zuordnen, wenn sie aus einem Controller geworfen wird
- C) Funktioniert nur auf Controller-Klassen
- D) Aktiviert automatisch SQL-Rollback
Antwort & Erklärung
Richtige Antwort: B
@ResponseStatus auf einer Exception-Klasse signalisiert den HTTP-Status, wenn die Exception aus einem Handler propagiert — oft kombiniert mit @ControllerAdvice für Bodies.
Warum die anderen Optionen falsch sind:
- A) Runtime Exceptions sind typisch für dieses Muster.
- C) Es gilt für Exception-Typen, nicht nur Controller.
- D) Transaction Rollback ist separates Thema.
Merksatz: „@ResponseStatus auf Exception → HTTP-Status beim Werfen."
Weiterlernen: Buchkapitel
Frage 34
Content-Type application/json bei einem POST-Request wird von welcher Spring-MVC-Komponente verarbeitet?
- A) Nur HandlerMapping
- B) HttpMessageConverter wie MappingJackson2HttpMessageConverter
- C) BeanFactoryPostProcessor
- D) TransactionInterceptor
Antwort & Erklärung
Richtige Antwort: B
HttpMessageConverters deserialisieren Request-Bodies und serialisieren Response-Bodies. Der Jackson-Converter verarbeitet JSON für @RequestBody und @ResponseBody.
Warum die anderen Optionen falsch sind:
- A) HandlerMapping wählt den Handler, nicht Body-Konvertierung.
- C) BeanFactoryPostProcessor läuft beim Context Startup.
- D) Transaktionen sind AOP-basiert, unabhängig von JSON-Parsing.
Merksatz: „JSON-Bodies → HttpMessageConverter (Jackson)."
Weiterlernen: Buchkapitel
Frage 35
Ein Request kommt als GET /reports ohne page-Parameter an. Welchen Wert erhält page?
@GetMapping("/reports")
public List<ReportDto> list(@RequestParam(defaultValue = "0") int page) { }
- A) null
- B) 0
- C) Startup schlägt fehl
- D) Zufällige Seitennummer
Antwort & Erklärung
Richtige Antwort: B
defaultValue auf @RequestParam liefert den Wert, wenn der Query-Parameter fehlt.
Warum die anderen Optionen falsch sind:
- A) Primitives können nicht null sein; Default greift.
- C) Fehlende optionale Params mit Default führen nicht zum Binding-Fehler.
- D) Spring nutzt den deklarierten Default, keine Zufallswerte.
Merksatz: „@RequestParam defaultValue greift, wenn Query-Param fehlt."
Weiterlernen: Buchkapitel
Frage 36
@RestControllerAdvice im Vergleich zu @ControllerAdvice auf einer Klasse, die auch @ResponseBody auf Methoden nutzt, ist primär:
- A) Äquivalent für REST-JSON-Fehlerbehandlung bei passender Kombination
- B) In Spring Boot illegal
- C) Nur für JSP-Views
- D) Ersetzt DispatcherServlet
Antwort & Erklärung
Richtige Antwort: A
@RestControllerAdvice entspricht @ControllerAdvice plus @ResponseBody — praktisch für REST-Exception-Handler, die JSON direkt zurückgeben.
Warum die anderen Optionen falsch sind:
- B) Beide werden unterstützt.
- C) REST Advice zielt auf HTTP-APIs, nicht JSP-Flows.
- D) DispatcherServlet bleibt Front Controller.
Merksatz: „@RestControllerAdvice = @ControllerAdvice + @ResponseBody."
Weiterlernen: Buchkapitel
Frage 37
Was generiert Spring Data JPA für ein Repository-Interface, das JpaRepository erweitert?
- A) Nur eine SQL-Datei auf der Festplatte
- B) Eine Runtime-Proxy-Implementierung mit CRUD- und Query-Method-Support
- C) Eine konkrete Klasse, die manuell kompiliert werden muss
- D) Eine JSP-Tag-Library
Antwort & Erklärung
Richtige Antwort: B
Spring Data erzeugt zur Laufzeit eine Proxy-Implementierung aus dem Repository-Interface — inklusive abgeleiteter Query-Methoden und Standard-JPA-Operationen.
Warum die anderen Optionen falsch sind:
- A) Implementierung ist runtime-generiert, nicht nur statische SQL-Dateien.
- C) Keine manuelle Implementierung für Standard-Repos nötig.
- D) Unabhängig von JSP.
Merksatz: „Spring Data JPA Repos = runtime-generierte Implementierungen."
Weiterlernen: Buchkapitel
Frage 38
Wie interpretiert Spring Data diesen Methodennamen?
List<Invoice> findByStatusAndDueDateBefore(String status, LocalDate date);
- A) Als native SQL-Datei findByStatusAndDueDateBefore.sql
- B) Als abgeleitete Query auf Entity-Properties status und dueDate
- C) Als JPQL-String, der immer @Query erfordert
- D) Als automatische Stored Procedure
Antwort & Erklärung
Richtige Antwort: B
Abgeleitete Query-Methoden parsen den Methodennamen in Queries gegen Entity-Attribute — hier Filter nach status und dueDate vor dem Datum.
Warum die anderen Optionen falsch sind:
- A) Keine externe SQL-Datei nötig.
- C) @Query ist optional, wenn Ableitung gelingt.
- D) Procedure Mapping erfordert explizite Annotation.
Merksatz: „Abgeleitete Query-Methodennamen → Entity-Property-Prädikate."
Weiterlernen: Buchkapitel
Frage 39
Warum ist orderRepository.save(order) hier möglicherweise unnötig?
@Transactional
public void cancelOrder(Long id) {
Order order = orderRepository.findById(id).orElseThrow();
order.cancel();
}
- A) JPA persistiert Änderungen nie
- B) Dirty Checking verfolgt Änderungen an managed Entities innerhalb der Transaktion
- C) cancel() ruft automatisch save auf
- D) Repositories committen jeden findById-Aufruf außerhalb von Transaktionen
Antwort & Erklärung
Richtige Antwort: B
Innerhalb einer Transaktion sind geladene Entities managed. Mutationen werden per Dirty Checking erkannt und beim Commit geflusht — ohne explizites save für bestehende Entities.
Warum die anderen Optionen falsch sind:
- A) JPA persistiert managed Entity-Änderungen beim Flush/Commit.
- C) cancel() ist Domain-Logik; Persistenz ist für managed Entities automatisch.
- D) findById nimmt am aktuellen Persistence Context teil, wenn transactional.
Merksatz: „Managed Entity-Änderungen flushen per Dirty Checking in einer Transaktion."
Weiterlernen: Buchkapitel
Frage 40
Default-Rollback-Verhalten für diese checked IOException:
@Transactional
public void importRows() throws IOException {
rowRepository.saveAll(rows);
throw new IOException("disk full");
}
- A) Transaktion committet, weil checked Exceptions standardmäßig nicht rollbacken
- B) Rollback immer bei allen Exceptions inklusive checked
- C) Rollback nur bei Error-Typen
- D) IOException wird von JPA ignoriert
Antwort & Erklärung
Richtige Antwort: A
Standardmäßig rollt Spring bei unchecked Exceptions und Error zurück. Checked Exceptions committen, sofern rollbackFor nicht konfiguriert ist.
Warum die anderen Optionen falsch sind:
- B) Checked Exceptions sind standardmäßig keine Rollback-Trigger.
- C) Unchecked RuntimeException rollt ebenfalls zurück.
- D) IOException beeinflusst Commit/Rollback-Semantik, wird nicht von JPA ignoriert.
Merksatz: „Default Rollback = unchecked Exceptions und Error, nicht checked."
Weiterlernen: Buchkapitel
Frage 41
Wann werden lines typischerweise mit LAZY Fetch geladen?
@OneToMany(mappedBy = "order", fetch = FetchType.LAZY)
private List<OrderLine> lines;
- A) Beim Anwendungsstart für alle Orders
- B) Wenn die lines-Collection innerhalb einer Session/Transaktion zugegriffen wird
- C) Nie; LAZY bedeutet kein Laden
- D) Nur während Component Scanning
Antwort & Erklärung
Richtige Antwort: B
Lazy Associations laden beim ersten Zugriff, solange der Persistence Context offen ist. Zugriff außerhalb einer Transaktion führt zu LazyInitializationException.
Warum die anderen Optionen falsch sind:
- A) Lazy lädt nicht alles eager beim Startup.
- C) Lazy verzögert Laden bis zum Zugriff.
- D) Component Scanning ist unabhängig.
Merksatz: „LAZY lädt bei Zugriff; offener Persistence Context nötig."
Weiterlernen: Buchkapitel
Frage 42
Das N+1-Query-Problem in JPA tritt oft auf, wenn:
- A) @Transactional auf Services genutzt wird
- B) N Parent-Entities geladen werden und dann pro Child-Association ein Query ausgelöst wird
- C) Nur abgeleitete Query-Methoden genutzt werden
- D) Nur H2 in Tests genutzt wird
Antwort & Erklärung
Richtige Antwort: B
N+1 entsteht, wenn ein Query Parents lädt und lazy Child-Zugriff pro Parent ein zusätzliches Query auslöst — außer mit Fetch Joins oder Batch Fetching.
Warum die anderen Optionen falsch sind:
- A) Transaktionen verursachen N+1 nicht von sich aus.
- C) Abgeleitete Queries sind unabhängig von Association-Fetch-Patterns.
- D) N+1 kann mit jeder Datenbank auftreten.
Merksatz: „N+1 = ein Query für Parents + einer pro Child bei lazy Zugriff."
Weiterlernen: Buchkapitel
Frage 43
REQUIRES_NEW Propagation bedeutet:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void writeAudit() { auditRepository.save(entry); }
- A) Immer der Caller-Transaktion beitreten
- B) Caller-Transaktion suspendieren und eine neue unabhängige Transaktion starten
- C) Nie eine Transaktion nutzen
- D) Nur Read-only-Optimierung
Antwort & Erklärung
Richtige Antwort: B
REQUIRES_NEW suspendiert eine bestehende Transaktion, öffnet eine neue und committet unabhängig. Rollback der inneren Transaktion beeinflusst die äußere nicht.
Warum die anderen Optionen falsch sind:
- A) REQUIRED tritt bei bestehender Transaktion bei; REQUIRES_NEW ist unabhängig.
- C) Es nutzt weiterhin eine Transaktion — eine neue.
- D) readOnly ist separates Attribut.
Merksatz: „REQUIRES_NEW = neue unabhängige Transaktion; äußere suspendiert."
Weiterlernen: Buchkapitel
Frage 44
Ein anderer Bean ruft outer() auf. Warum läuft inner() möglicherweise nicht transactional?
public void outer() { inner(); }
@Transactional
public void inner() { repository.save(entity); }
- A) @Transactional funktioniert nie auf Services
- B) outer() ruft inner() via this auf und umgeht den Proxy
- C) save läuft immer ohne Transaktionen
- D) Repository-Saves starten nur eigene mandatory Transaktionen
Antwort & Erklärung
Richtige Antwort: B
Self-Invocation innerhalb derselben Klasse umgeht den Spring-AOP-Proxy — @Transactional auf inner() greift nicht, wenn von outer() aufgerufen.
Warum die anderen Optionen falsch sind:
- A) @Transactional funktioniert, wenn Aufrufe über den Proxy laufen.
- C) Persistence braucht Context; Proxy-Bypass ist die Falle.
- D) Das Problem ist Proxy-Eintritt, nicht nur Repository-Transaktionen.
Merksatz: „Same-Class-Aufrufe umgehen Proxy → @Transactional greift evtl. nicht."
Weiterlernen: Buchkapitel
Frage 45
In der Spring-Security-Filter-Chain-Architektur: Wo findet Authentication typischerweise relativ zu Authorization statt?
- A) Authorization immer vor Authentication
- B) Authentication stellt Identität her, bevor Authorization Zugriff prüft
- C) Sie sind derselbe Filter
- D) Beides läuft nicht für REST-APIs
Antwort & Erklärung
Richtige Antwort: B
Security-Filter authentifizieren (wer bist du) und autorisieren dann (was darfst du). Authentication muss den SecurityContext füllen, bevor Access Decisions fallen.
Warum die anderen Optionen falsch sind:
- A) Access Decisions brauchen zuerst einen authentifizierten Principal.
- C) Separate Filter mit unterschiedlichen Aufgaben.
- D) REST-APIs nutzen weiterhin die Security-Filter-Chain, wenn aktiviert.
Merksatz: „Zuerst authentifizieren, dann autorisieren."
Weiterlernen: Buchkapitel
Frage 46
Was bedeutet permitAll() auf /public/**?
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated());
- A) Erfordert ADMIN-Rolle
- B) Erlaubt Zugriff ohne Authentication für passende Pfade
- C) Deaktiviert HTTPS
- D) Aktiviert CSRF-Schutz nur auf /public
Antwort & Erklärung
Richtige Antwort: B
permitAll gewährt uneingeschränkten Zugriff auf gematchte Requests ohne authentifizierten Principal.
Warum die anderen Optionen falsch sind:
- A) ADMIN würde hasRole nutzen.
- C) Transport Security ist separat.
- D) CSRF-Regeln werden woanders konfiguriert.
Merksatz: „permitAll = keine Authentication für gematchte Pfade nötig."
Weiterlernen: Buchkapitel
Frage 47
Best Practice für Passwort-Speicherung in Spring Security:
- A) Plain-Text PasswordEncoder
- B) BCryptPasswordEncoder oder delegating Encoder mit starkem Hashing
- C) MD5 ohne Salt
- D) Nur Base64-Kodierung
Antwort & Erklärung
Richtige Antwort: B
Spring Security empfiehlt starkes adaptives Hashing wie BCrypt via PasswordEncoder — nie Plain Text oder schwache Hashes.
Warum die anderen Optionen falsch sind:
- A) Kein Plain-Text-Encoder ist sicher.
- C) MD5 ist ungeeignet für Passwort-Speicherung.
- D) Base64 ist Kodierung, kein Hashing.
Merksatz: „Passwörter mit BCrypt PasswordEncoder speichern, nicht im Klartext."
Weiterlernen: Buchkapitel
Frage 48
Eine stateless JWT REST API sollte typischerweise:
- A) Session-Erzeugung für jeden Request aktivieren
- B) CSRF deaktivieren, weil Browser JWTs nicht wie Cookies bei klassischen Form-Posts auto-submitten
- C) JWT nur in server HttpSession speichern
- D) Alle Authorization-Regeln entfernen
Antwort & Erklärung
Richtige Antwort: B
Stateless Token APIs deaktivieren oft CSRF, weil CSRF cookie-basierte Session-Auth zielt. JWT im Authorization-Header ist ein anderes Threat Model.
Warum die anderen Optionen falsch sind:
- A) Stateless Design vermeidet Server-Sessions pro Request.
- C) JWT-Stateless-Pattern vermeidet HttpSession für Auth-Token.
- D) Authorization bleibt erforderlich.
Merksatz: „Stateless JWT APIs deaktivieren oft CSRF; Endpoints weiter autorisieren."
Weiterlernen: Buchkapitel
Frage 49
Wann wird diese Authorization für Spring-MVC-Beans durchgesetzt?
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) { }
- A) Nur zur Compile-Zeit
- B) Bei Methodenaufruf via Method-Security-AOP nach @EnableMethodSecurity
- C) Nur in der Datenbankschicht
- D) Nur für statische Methoden
Antwort & Erklärung
Richtige Antwort: B
@PreAuthorize wird von Method-Security-Interceptors um Bean-Methodenaufrufe evaluiert, wenn Method Security aktiviert ist.
Warum die anderen Optionen falsch sind:
- A) Enforcement ist zur Laufzeit via AOP.
- C) Es schützt die Service-Methode, nicht SQL direkt.
- D) Instanzmethoden auf Spring Beans werden advised.
Merksatz: „@PreAuthorize wird zur Laufzeit per Method-Security-AOP durchgesetzt."
Weiterlernen: Buchkapitel
Frage 50
CORS-Konfiguration in Spring Security/Boot adressiert:
- A) Cross-Origin-Browser-Requests und Preflight-OPTIONS-Handling
- B) SQL-Injection-Prävention
- C) Passwort-Hashing
- D) JPA Lazy Loading
Antwort & Erklärung
Richtige Antwort: A
CORS steuert, welche Browser-Origins APIs cross-origin aufrufen dürfen — inklusive Preflight OPTIONS für non-simple Requests.
Warum die anderen Optionen falsch sind:
- B) SQL Injection ist Input-/Parametrisierungs-Thema.
- C) Passwörter nutzen PasswordEncoder.
- D) JPA Lazy Loading ist Persistenz-Thema.
Merksatz: „CORS = Cross-Origin-Browser-Zugriffsregeln und Preflight."
Weiterlernen: Buchkapitel
Frage 51
@WebMvcTest lädt primär:
- A) Vollständigen Application Context inklusive aller Repositories und Scheduler
- B) Web-Layer-Slice: MVC, Jackson, oft @Controller unter Test mit gemockten Collaborators
- C) Nur JPA-Entities ohne Controller
- D) Nur Production-Database-Migrationen
Antwort & Erklärung
Richtige Antwort: B
@WebMvcTest ist ein schmaler Slice für Controller-Tests mit MockMvc, kein Full-Stack-Integrationstest.
Warum die anderen Optionen falsch sind:
- A) Full Context ist @SpringBootTest.
- C) JPA-Slice ist @DataJpaTest.
- D) Flyway/Liquibase laufen ggf. in Integrationstests, nicht im Web-Slice-Default.
Merksatz: „@WebMvcTest = MVC-Slice + MockMvc, kein Full Context."
Weiterlernen: Buchkapitel
Frage 52
Warum wird hier @MockBean genutzt?
@WebMvcTest(OrderController.class)
class OrderControllerTest {
@MockBean OrderService orderService;
}
- A) Um eine fehlende Dependency im Test-ApplicationContext durch einen Mockito-Mock-Bean zu ersetzen
- B) Um Production-Database-Zugriff zu aktivieren
- C) Um MockMvc zu deaktivieren
- D) Um Tests ohne Spring auszuführen
Antwort & Erklärung
Richtige Antwort: A
@MockBean registriert einen Mockito-Mock im Spring-Test-Context und ersetzt oder ergänzt einen Bean, den der Web-Slice braucht.
Warum die anderen Optionen falsch sind:
- B) Web-Slice vermeidet echte Persistenz standardmäßig.
- C) MockMvc funktioniert weiter.
- D) @WebMvcTest nutzt weiterhin Spring Test Context.
Merksatz: „@MockBean bringt einen Mock in den Spring-Test-Context."
Weiterlernen: Buchkapitel
Frage 53
@DataJpaTest konfiguriert typischerweise automatisch:
- A) Vollständige Spring-Security-Filter-Chain und alle Controller
- B) In-Memory-DataSource, JPA, TestEntityManager und Repository unter Test
- C) Nur MockMvc
- D) Nur @Scheduled Tasks
Antwort & Erklärung
Richtige Antwort: B
@DataJpaTest fokussiert JPA-Komponenten mit eingebetteter Datenbank und TestEntityManager für Persistenztests.
Warum die anderen Optionen falsch sind:
- A) Security und Controller sind vom JPA-Slice ausgeschlossen.
- C) MockMvc gehört zu Web-Tests.
- D) Scheduling ist nicht JPA-Slice-Fokus.
Merksatz: „@DataJpaTest = JPA + embedded DB + TestEntityManager."
Weiterlernen: Buchkapitel
Frage 54
@SpringBootTest im Vergleich zu Slice-Tests:
- A) Lädt den vollständigen Application Context (oder nahezu vollständig) für Integrationstests
- B) Ist immer schneller, weil weniger geladen wird
- C) Kann @Autowired nicht nutzen
- D) Deaktiviert alle Beans
Antwort & Erklärung
Richtige Antwort: A
@SpringBootTest startet den vollen Application Context — geeignet für Integrationstests über Layer hinweg.
Warum die anderen Optionen falsch sind:
- B) Full Context ist schwerer, nicht leichter.
- C) @Autowired funktioniert in SpringBootTest.
- D) Es lädt echte Beans, sofern nicht gemockt.
Merksatz: „@SpringBootTest = vollständiger Integrations-Context."
Weiterlernen: Buchkapitel
Frage 55
Dieser @WebMvcTest-Test verifiziert primär:
@Test
void delegatesToService() {
when(orderService.find(1L)).thenReturn(Optional.of(dto));
mockMvc.perform(get("/orders/1")).andExpect(status().isOk());
}
- A) Datenbank-Constraint-Korrektheit
- B) HTTP-Mapping und Controller-Delegation mit gemocktem Service
- C) Production-Actuator-Health
- D) Git-Commit-Hooks
Antwort & Erklärung
Richtige Antwort: B
MockMvc testet die Web-Schicht, während @MockBean Collaborators isoliert — Mapping, Status und JSON ohne Full Stack.
Warum die anderen Optionen falsch sind:
- A) Datenbank gehört zu @DataJpaTest oder Integrationstests.
- C) Actuator ist separates Test-Thema.
- D) Unabhängig von MVC-Tests.
Merksatz: „MockMvc + @MockBean testet Controller-Verdrahtung isoliert."
Weiterlernen: Buchkapitel
Frage 56
@Mock versus @MockBean: zentraler Unterschied?
- A) @Mock ist reines Mockito ohne Spring Context; @MockBean registriert Mock im Spring-Test-Context
- B) Sie sind immer identisch
- C) @MockBean funktioniert nur in der Hauptanwendung
- D) @Mock lädt die volle Spring-Boot-App
Antwort & Erklärung
Richtige Antwort: A
@Mock ist für plain Unit Tests. @MockBean integriert Mockito-Mocks in Spring TestContext und ersetzt Container-Beans.
Warum die anderen Optionen falsch sind:
- B) Spring-Context-Integration unterscheidet sich.
- C) @MockBean ist für Tests.
- D) @Mock startet kein Spring.
Merksatz: „@Mock = nur Mockito; @MockBean = Mock im Spring-Test-Context."
Weiterlernen: Buchkapitel
Frage 57
In Spring AOP ist ein Join Point typischerweise:
- A) Eine Methodenausführung auf einem Spring-verwalteten Bean
- B) Jede Bytecode-Zeile in der JVM
- C) Nur Database-Trigger-Ausführung
- D) Nur statische Initializer-Blöcke
Antwort & Erklärung
Richtige Antwort: A
Spring AOP unterstützt Method-Execution-Join-Points auf Spring Beans. Es ist kein vollständiges AspectJ-Weaving aller Join Points standardmäßig.
Warum die anderen Optionen falsch sind:
- B) Spring AOP ist method-interception-basiert auf Beans.
- C) Database Triggers liegen außerhalb Spring AOP.
- D) Statische Blöcke werden standardmäßig nicht advised.
Merksatz: „Spring-AOP-Join-Point = Methodenausführung auf einem Spring Bean."
Weiterlernen: Buchkapitel
Frage 58
Was steuert @Around Advice?
@Aspect
@Component
public class TimingAspect {
@Around("execution(* com.example.service..*(..))")
public Object time(ProceedingJoinPoint pjp) throws Throwable {
long start = System.nanoTime();
Object result = pjp.proceed();
// log duration
return result;
}
}
- A) Nur Code vor der Methode
- B) Umschließt den Join Point und kann Code vor/nach ausführen und proceed() steuern
- C) Nur nach erfolgreichem Return
- D) Nur ungefangene Exceptions
Antwort & Erklärung
Richtige Antwort: B
@Around Advice umschließt den Join Point. proceed() muss aufgerufen werden, um das Target zu invoken — Argumente, Rückgabewert und Exceptions können modifiziert werden.
Warum die anderen Optionen falsch sind:
- A) Nur-vorher ist @Before Advice.
- C) Nach Return ist @AfterReturning.
- D) Exception Handling kann @AfterThrowing nutzen.
Merksatz: „@Around umschließt die Methode und ruft proceed() zum Weiterlaufen auf."
Weiterlernen: Buchkapitel
Frage 59
@EnableAsync auf einer Configuration-Klasse aktiviert:
- A) Nur synchrone Methodenausführung
- B) Proxy-basierte asynchrone Ausführung für @Async-Methoden via Task Executor
- C) Automatisches HTTP-Caching
- D) Nur JPA Second-Level-Cache
Antwort & Erklärung
Richtige Antwort: B
@EnableAsync registriert Infrastruktur, die @Async-Methoden auf einem Task-Executor-Thread statt im Caller-Thread ausführt.
Warum die anderen Optionen falsch sind:
- A) Es aktiviert Async, nicht Sync-only.
- C) HTTP-Caching ist separat.
- D) JPA-Cache ist Persistenz-Konfiguration.
Merksatz: „@EnableAsync + @Async führt Methoden auf Executor-Threads aus."
Weiterlernen: Buchkapitel
Frage 60
Spring Application Events über ApplicationEventPublisher sind standardmäßig:
- A) Automatisch in der Datenbank persistiert
- B) Synchron an Listener im Publisher-Thread geliefert, sofern Listener nicht @Async nutzen
- C) Per HTTP an alle Clients gesendet
- D) Ignoriert, außer der Publisher ist ein @Controller
Antwort & Erklärung
Richtige Antwort: B
Standard-Event-Delivery ist synchron im Caller-Thread. @Async-Listener mit aktiviertem Async können in Hintergrundthreads verarbeiten.
Warum die anderen Optionen falsch sind:
- A) Events sind standardmäßig in-memory.
- C) Events sind keine HTTP-Broadcasts.
- D) Jeder Bean kann Events publizieren und empfangen.
Merksatz: „Spring Events sind standardmäßig synchron im Publisher-Thread."
Weiterlernen: Buchkapitel
Ende von Mock Full 05 — Spring Professional (60 Fragen)