Exam Drill #12 · 30 Aug 2026 · 19 to fix · 30 drills

Twelfth attempt — MVC held 100%, and four questions you've now missed more than once

41/60 = 68%. Spring MVC scored 100% for the second consecutive paper — it is genuinely finished. But this paper has an uncomfortable signature: four of the nineteen are questions you have already met and already missed, one of them for the third time. That's 4 marks sitting in material you own, against a gap of 5. This page is built for drilling rather than reading — the explanations are short and there are 30 questions.

Numbering note: you called this attempt 11, but #11 was the 29 Aug paper — this is #12.

100%
MVC — held twice
4
Repeats you've missed before
61%
Spring Boot — decaying
+5
Questions to pass
Official result · practice exam

68% — you did not pass this time

76% required to pass · 60/60 answered · 41 correct · time used 40m 54s of 2h 10m
Spring MVC 100%— held0 misses Testing 75%▲ 151 miss Spring Core 70%▲ 127 misses Data Management 70%▼ 163 misses Spring Security 67%▲ 171 miss Spring Boot 61%▼ 147 misses

Four of six sections went up, and MVC held its perfect score. Spring Core recovered from 58% to 70%, Security from 50% to 67%, Testing from 60% to 75%. Nothing regressed badly.
But Spring Boot is decaying. 86% → 75% → 61% across the three papers since its clinic — and it now holds 7 of the 19 misses, level with Core. The clinic gain is wearing off exactly as the earlier ones did without re-drilling.
The clock went back up. 40m 54s, from 35m on the last paper. Good — but still only 31% of the time, with 89 minutes unused.

Four questions you have now missed more than once

This is the thing to take away from this paper. These aren't similar questions — they are the same questions, with the same options, previously explained on this site.

QQuestionPreviouslyWhat you ticked this time
Q28Valid SpEL expressions#7 Q53 · #8 Q21 — third time(() => 2 * 3)(), the JavaScript arrow function, again
Q39Advice types accepting a JoinPoint#6 Q22"None of the above" — the same wrong option
Q45Authentication mechanisms#11 Q17 — yesterdayLDAP (a user store, not a mechanism)
Q53Web-only Actuator endpointsBoot clinic §1threaddump — the trap the clinic names explicitly

Q28 is the one to sit with. An option written in JavaScript has now been offered to you three times across three weeks, and you have ticked it three times. It is not a Spring question — it is a "which language is this?" question. Arrow functions are JavaScript. Java and SpEL have no such syntax.

What this says about method. All four were read in a review or clinic. None were retrieved under pressure. Reading builds recognition — you'd know the right answer if I asked you now — but the exam tests recall against four plausible options and a ticking clock. That's the gap the drills close, and it's why this page is 35 questions and short explanations.

Spring MVC: 100%, twice

MVC was 50% eight days ago and had never been above 75% in ten attempts. After three drill rounds it has scored 100% on two consecutive papers with zero misses. That is the first section to hold a perfect score twice, and it is the strongest evidence yet that the clinic-then-drill loop works.

The counter-example is on the same page: Spring Boot got a clinic, jumped to 86%, and has fallen to 61% across two papers without being re-drilled. Build, drill, then re-drill — the third step is the one that's missing.

How to get the five marks

BucketMarksWhat it costs
Repeats already explained here
Q28, Q39, Q45, Q53
4Drill them — don't re-read them. ~15 minutes.
Spring Boot re-drill
Q1, Q4, Q11, Q29, Q50, Q53 all sit in the Boot clinic
6Boot clinic, 45 drills. ~25 minutes.
Invented names + polarity
Q3 @Property · Q16 two fakes · Q24 "which is NOT"
3Zero study. Two habits you already know.
④ Genuinely new (transaction attributes, lifecycle interfaces, pointcut patterns, Micrometer) 6Real study — not needed to pass.

Bucket ① alone is 4 against a gap of 5, and buckets ①+③ are 7. Neither requires learning anything new. The single highest-value action available to you is to drill what you have already been taught.

Section scores, attempts #8 to #12

Section#8#9#10#11#12 · 30 AugVerdict
Spring MVC40%57%50%100%100%Finished — held twice
Testing100%100%33%60%75%Recovering
Spring Core61%75%73%58%70%Still never above 75%
Data Management75%81%82%86%70%Slipped — needs a re-drill
Spring Security100%75%33%50%67%Small section, 1 miss
Spring Boot71%56%86%75%61%Decaying since its clinic
Overall70%73%70%70%68%Flat — but see below
The overall number has been flat at 68–73% for six papers, and the reason is now clear. Each clinic lifts its section sharply, then that section decays while you build the next one — Boot went 56 → 86 → 75 → 61, Data went 57 → 86 → 70. MVC is the exception, and it's the only one you drilled three times.

So the constraint has changed. You are no longer short of material: 231 corrected facts across twelve reviews, three topic clinics and 750+ drills. What's missing is a rotation — 20 minutes of drilling across all four clinics before each attempt, rather than reading one new page.
Your failure modes — 19 misses

The 19 questions you failed

QTopicWhat you answeredThe answer
Q1Resetting a logger level"OPTIONS with null" + "not possible"POST {"configuredLevel": null}
Q3Injecting a private field"@Property" — invented@Autowired · @Inject · @Value
Q4Default protocol for loggers"SMTP" + "FTP"JMX
Q6Lifecycle callback interfaces"InitializingBean has postConstruct"afterPropertiesSet() · destroy()
Q11Condition on a property value"@ConditionalOnBean"@ConditionalOnProperty · @ConditionalOnExpression
Q13Microservice advantages"imply a simple distributed system"Simpler codebase · independent deploy · fine-grained scaling
Q16Enabling @TransactionalTwo invented options@EnableTransactionManagement · or nothing, under Boot
Q17@Transactional attributes"exit code" + "callback"readOnly · rollbackFor · noRollbackFor · timeout
Q19Advantages of interfaces"promotes high coupling"The other five
Q24Invalid SpEL compiler mode"IMMEDIATE" — which is validON and LAZY don't exist
Q28Valid SpEL expressionsJavaScript arrow function — third timeT() · ![] · ?[] · method calls
Q29Why starters are useful"reduce JAR size" + "optimize startup"Curated versions · less research · auto-config
Q31@DataJpaTest"It loads @Component/@Service/@Controller"Embedded DB · scans repositories · transactional
Q37"Supports a current tx, creates one if none"Four wrong options tickedREQUIRED
Q39Advice types taking a JoinPoint"None of the above" — also #6All four of them
Q45Authentication mechanisms"LDAP" — also #11, yesterdayX.509 · Digest · Basic · OAuth2 · Form
Q50Actuator + monitoring systems"custom @RestControllers" + "custom SPIs"Micrometer
Q52Pointcut expression behaviourUnder-selected — three of four correctMatches overloads · save* works · package-sensitive
Q53Web-only endpoints"threaddump" — Boot clinic names this trapheapdump · logfile

Jump to a section

① Spring Boot & Actuator — 7 ② SpEL — 2 ③ AOP — 2 ④ Beans & interfaces — 3 ⑤ Data & transactions — 3 ⑥ Testing — 1 ⑦ Security — 1

① Spring Boot & Actuator 7 misses

61%, decaying since the clinic — and six of these seven are in it. This section needs a re-drill, not new material.

Q1 · Resetting a logger level

POST {"configuredLevel": null} to /actuator/loggers/{name}

Your answer: "OPTIONS with a null body" and "it isn't possible". The verb is always POST, and the endpoint is explicitly designed to be reversible.

Every logger has two levels, and that's the whole question:

FieldMeans
configuredLevelthe explicit override — may be null
effectiveLevelwhat actually applies, inherited from the parent if no override

Sending null clears the override, so the logger falls back to inheritance. Posting "INFO" instead would set a new override that happens to be INFO — not the same thing, since the original might have been WARN inherited from a parent.

Memory hook: POST {"configuredLevel": null} = remove the override, restore inheritance. Setting INFO is not resetting.
Q4 · Default protocol for the loggers endpoint Boot clinic table 1

JMX — over HTTP only health is exposed by default

Your answer: SMTP and FTP. Neither has anything to do with Actuator — and HTTP, the one that sounds right, is wrong for the reason the clinic hammers.

The enabled/exposed table, one more time:

TransportDefault exposure
JMX* — every enabled endpoint
HTTPhealth only

So loggers is reachable out of the box — over JMX. For HTTP you need management.endpoints.web.exposure.include=loggers. And the two-transport rule kills SMTP and FTP instantly: every Actuator property path contains either web or jmx.

Memory hook: JMX = everything by default. HTTP = health only. Two transports, no others.
Q53 · Web-only endpoints Boot clinic §1 names this exact trap

heapdump and logfilethreaddump is not web-only

Your answer: you ticked threaddump. The Boot clinic calls it out by name: "threaddump is the trap: it returns JSON, so JMX handles it fine."

The reason, so it sticks without memorising a list: JMX carries structured attributes. heapdump returns a binary hprof file; logfile returns a text stream. Neither fits down a JMX pipe. threaddump returns JSON — perfectly carryable.

Ask "is it a file or a stream?" If yes, web-only. If it's structured data, both transports. Only heapdump, logfile and jolokia qualify.

Memory hook: Web-only = a file or a stream: heapdump, logfile. threaddump is JSON, so JMX carries it.
Q11 · Conditioning on a property value

@ConditionalOnProperty — and @ConditionalOnExpression also works

Your answer: you ticked @ConditionalOnBean. That tests for a bean, not a property value.
AnnotationFires when
@ConditionalOnProperty(name=…, havingValue="true")the property has that value — the direct tool
@ConditionalOnExpression("${…:false}")a SpEL expression is true — more flexible
@ConditionalOnBean / @ConditionalOnMissingBeana bean is present / absent
@ConditionalOnClass / @ConditionalOnMissingClassa class is on the classpath
@ConditionalOnResourcea resource exists on the classpath

Read the suffix and it answers itself: OnProperty → a property, OnBean → a bean, OnClass → a class, OnResource → a resource. The naming is completely literal.

Useful detail: @ConditionalOnProperty has a matchIfMissing attribute — true means "apply when the property is absent", which is how Boot writes opt-out defaults.

Memory hook: The suffix names what it tests. Property value ⇒ @ConditionalOnProperty (or @ConditionalOnExpression for SpEL).
Q29 · Why starters are useful

Curated, version-aligned dependencies plus auto-configuration — not smaller jars or faster startup

Your answer: "they reduce the size of the produced JAR" and "they optimize JVM startup time". Both are the opposite of true — starters pull in more.
Starters DOStarters DON'T
Bundle a curated dependency setReduce jar size — they increase it
Align versions via the Boot BOMImprove startup — more classes means slower
Pull in matching auto-configurationsContain any code of their own (a starter is just a POM)
Save you researching compatible librariesInclude a database driver

A starter is a convenience for the developer, not the runtime. If an option claims a starter improves a runtime characteristic — size, speed, memory — it's wrong. The benefit is entirely at build and configuration time.

Memory hook: Starters are a build-time convenience: curated set + aligned versions + auto-config. They make the jar bigger, not smaller.
Q50 · How Actuator integrates with monitoring systems

Micrometer — the vendor-neutral metrics facade

Your answer: "custom @RestControllers" and "custom SPI implementations". Both put the work on the developer. The point of Micrometer is that you write nothing.

Micrometer is "SLF4J for metrics" — one API, many backends. Add a registry dependency and it wires itself up:

Add this artifactAnd you get
micrometer-registry-prometheus/actuator/prometheus in Prometheus format
micrometer-registry-datadogmetrics pushed to Datadog
micrometer-registry-elastic, -influx, -statsd, -new-relicthe same, per backend

A CompositeMeterRegistry fans every meter out to all registered backends, so one Counter can reach several systems at once. The integration is dependency-driven — you add a jar, not code.

Don't confuse the two Actuator concerns: HealthIndicator feeds /actuator/health (is the app alive?); Micrometer feeds metrics backends (how is it behaving?). The third distractor tried to swap them.

Memory hook: Micrometer = SLF4J for metrics. Add a micrometer-registry-* jar, write nothing. HealthIndicators are for /health, not for monitoring backends.
Q13 · Advantages of microservices

Simpler codebase · independent deployment · fine-grained scaling — not simplicity of the system

Your answer: you ticked "imply a simple distributed system". Microservices make each service simpler and the system more complex — that's the trade.
You gainYou pay
A small, comprehensible codebase per serviceNetwork latency and partial failure
Independent deploymentService discovery, versioning, contracts
Fine-grained scaling — scale only what's hotDistributed transactions and eventual consistency
Technology choice per serviceFar more operational surface

The phrase "simple distributed system" is nearly a contradiction, and that's the tell. Distribution is the cost you accept in exchange for the three benefits — no architecture question will ever list it as an advantage.

Memory hook: Microservices simplify each service and complicate the system. Distribution is always a cost, never a benefit.

② SpEL 2 misses

Q28 · Valid SpEL expressions third time — #7, #8, here

(() => 2 * 3)() is JavaScript. It has never been valid in anything Java.

Your answer: you ticked the arrow function again. Same option, same three papers, same tick. Everything else in that question was correct.

Stop treating this as a SpEL question. It is a which language is this? question, and it can be answered without knowing SpEL at all:

SyntaxLanguage
() => expr — arrow functionJavaScript
x -> expr — lambdaJava (and not valid in SpEL either)
T(java.util.Date)SpEL type reference
list.![expr]SpEL projection — map
list.?[pred]SpEL selection — filter
isMember('x')SpEL method invocation on the root object

SpEL has no lambdas, no arrow functions and no anonymous functions of any kind. It is an expression language for navigating and filtering data, not a programming language. If a snippet defines and invokes a function, it isn't SpEL.

The four real ones are worth reciting as a set: T() reaches statics · ![] maps · ?[] filters · a bare name is a method call on the root object.

Memory hook: => is JavaScript. SpEL: T() statics, ![] map, ?[] filter, ^[]/$[] first/last. No functions, ever.
Q24 · Which is NOT a valid SpEL compiler mode polarity · the eighth

ON and LAZY don't exist — IMMEDIATE does

Your answer: you ticked IMMEDIATE, which is one of the three real modes. The stem asked for the invalid ones.
SpelCompilerModeCompilesOn failure
OFF (default)never — always interpreted
IMMEDIATEas soon as possible, after the first evaluationthrows
MIXEDafter several interpreted runsfalls back silently
ON, LAZYdo not exist

Three modes, and the names describe when: never / immediately / after a while. ON would be redundant with IMMEDIATE, and LAZY describes when in a way the enum already covers with MIXED. Plausible words that duplicate an existing member are usually invented.

On the polarity slip — the eighth. Every one has followed the same shape: a capitalised or emphasised negative in the stem, answered in the positive. The mechanical fix costs five seconds: before reading the options, say what you are hunting for. "I want the ones that do NOT exist."

Memory hook: OFF · IMMEDIATE · MIXED. Three modes describing WHEN. No ON, no LAZY.

③ AOP 2 misses

Q39 · Advice types accepting a JoinPoint same wrong option as #6 Q22

All four — and "None of the above" was the option you took last time too

Your answer: "None of the above". On attempt #6 you ticked exactly this option on exactly this question.
AdviceFirst parameter
@BeforeJoinPoint — optional
@AfterJoinPoint — optional
@AfterReturningJoinPoint — optional, then the returning binding
@AfterThrowingJoinPoint — optional, then the throwing binding
@AroundProceedingJoinPoint — required

"None of the above" is an absolute, and on this paper it was the only wrong option among five. Taking it means asserting that all four listed advice types reject a parameter Spring documents for every one of them.

The one fact behind it: ProceedingJoinPoint extends JoinPoint. So @Around doesn't lack JoinPoint — it needs the richer subinterface, because only it can call proceed().

Memory hook: All advice can take a JoinPoint. @Around needs ProceedingJoinPoint, which IS a JoinPoint. "None of the above" is almost never right here.
Q52 · Reading a pointcut expression under-selected

Three of four true — it does not match other classes in the package

Your answer: under-selected. You correctly rejected the false one; you just didn't tick everything true.

Read execution(* com.example.service.UserService.saveUser(..)) segment by segment:

SegmentMeans
*any return type
com.example.service.UserServicethat one class — so moving it breaks the expression
saveUserexact method name — change to save* for a prefix
(..)any parameter list — so all overloads match
ExpressionMatches
…UserService.saveUser(..)every saveUser overload in UserService
…UserService.save*(..)all save… methods in that class
…service.*.saveUser(..)saveUser in any class in the package
com.example..*.saveUser(..)…and in sub-packages too (..)

Two dots mean two different things, which is the thing to hold: (..) in the parameter position = any arguments; .. in the package position = this package and below.

Memory hook: (..) = any parameters (so all overloads). .. in a package = and sub-packages. * = one segment.

④ Beans & interfaces 3 misses

Q3 · Injecting into a private field invented annotation

@Autowired, @Inject and @Value all work — via reflection

Your answer: you ticked @Property. No such annotation exists in Spring. You were right about the other three.

Private is not an obstacle: Spring uses ReflectionUtils.makeAccessible() to bypass access control, so all three inject into a private field exactly as they would a public one.

AnnotationOriginInjects
@AutowiredSpringa bean, by type
@InjectJSR-330a bean, by type
@ResourceJSR-250a bean, by name
@ValueSpringa property or SpEL result
@Propertydoes not exist

Why @Property feels real: it's the plain-English word for what @Value does — the same family as Language for Locale and @NoRollback for @Rollback(false). Everyday words standing in for technical ones.

Worth remembering the caveat the question notes: field injection works but is discouraged — constructor injection makes dependencies explicit, supports final fields, and needs no reflection to test.

Memory hook: Private fields inject fine — Spring uses reflection. @Autowired · @Inject · @Resource · @Value. There is no @Property.
Q6 · Lifecycle callback interfaces

InitializingBean.afterPropertiesSet() and DisposableBean.destroy()

Your answer: you ticked "InitializingBean has a method named postConstruct". The method is afterPropertiesSet(); @PostConstruct is a separate JSR-250 annotation.
RouteInitDestroy
Annotation (JSR-250)@PostConstruct@PreDestroy
Interface (Spring)InitializingBean.afterPropertiesSet()DisposableBean.destroy()
Attribute@Bean(initMethod = "…")@Bean(destroyMethod = "…")

Three routes, and they run in that order — annotation, then interface, then attribute — on both sides of the lifecycle. That ordering has appeared on several of your papers.

The names are worth reading literally: afterPropertiesSet says when it runs — after dependency injection completes. @PostConstruct says the same thing in a different vocabulary. Same moment, two mechanisms, two different names — and neither borrows the other's. There is no init() in InitializingBean either.

Prefer the annotations: the interfaces couple your domain classes to Spring, which is exactly what "non-invasive" is meant to avoid.

Memory hook: InitializingBean → afterPropertiesSet() · DisposableBean → destroy(). @PostConstruct/@PreDestroy are the JSR-250 annotations. Annotation → interface → initMethod.
Q19 · Advantages of using interfaces

Five true — the false one claims high coupling is good

Your answer: you ticked "promotes high coupling to make the system harder to change, which leads to a smaller amount of bugs". The option argues against itself — "harder to change" is never presented as a benefit.

The five genuine advantages, and one is Spring-specific:

AdvantageWhy
Implementation hidingthe contract is separate from the how
Decouplingdepend on the type, not the class
Easy bean switchingswap a mock in tests, a strategy in production
Interchangeabilitya direct consequence of the above
Enables JDK dynamic proxiesSpring AOP can proxy via the interface instead of subclassing

The proxy point is the exam-relevant one. With an interface Spring can use a JDK dynamic proxy; with no interface it must use CGLIB, which can't proxy final classes or methods. Note that Spring Boot still defaults to CGLIB (proxyTargetClass=true) — having an interface makes JDK proxying possible, not automatic.

And the pitfall that follows: under a JDK proxy, injecting the concrete class fails with BeanNotOfRequiredTypeException — the proxy implements the interface but is not an instance of your class. Inject the interface.

Memory hook: Interfaces: hide implementation, decouple, swap easily, and enable JDK proxies. Any option praising high coupling is wrong.

⑤ Data & transactions 3 misses

Q37 · "Supports a current transaction, creates a new one if none exists"

REQUIRED — and you ticked four other options

Your answer: NOT_SUPPORTED, MANDATORY, NEVER and SUPPORTS. Four ticks on a question with one answer — and the stem is the textbook definition of the default.

Take the stem's two clauses and eliminate:

ClauseRules out
"supports a current transaction" (joins one)NOT_SUPPORTED (suspends), NEVER (throws)
"creates a new one if none exists"MANDATORY (throws), SUPPORTS (runs non-tx)
"joins or creates"REQUIRES_NEW (always creates, never joins)
what's leftREQUIRED

SUPPORTS is the near-miss, and the trap is the word "supports" in the stem. SUPPORTS joins an existing transaction but runs without one when none exists — it never creates. The second clause is what separates them.

The seven levels, in the two columns that answer every propagation question:

PropagationNo existing txExisting tx
REQUIRED (default)createjoin
REQUIRES_NEWcreatesuspend, create
NESTEDcreatesavepoint
SUPPORTSrun non-txjoin
NOT_SUPPORTEDrun non-txsuspend
MANDATORYthrowjoin
NEVERrun non-txthrow
Memory hook: REQUIRED = join or create. SUPPORTS = join or run without. The difference is what happens when there's no transaction.
Q16 · Enabling @Transactional two invented options

@EnableTransactionManagement — or nothing at all under Boot

Your answer: @Configuration(enableTransactions=true) and @EnableDatabaseTransactions. Neither exists. Both correct options went unticked.

The naming convention would have eliminated both: Spring feature switches are always @EnableXxx on a @Configuration class, never an attribute of @Configuration itself.

RealEnables
@EnableTransactionManagement@Transactional
@EnableAspectJAutoProxy@Aspect
@EnableCaching@Cacheable
@EnableScheduling · @EnableAsync@Scheduled · @Async

And the second correct option matters: in Spring Boot you write nothingTransactionAutoConfiguration applies @EnableTransactionManagement for you when a PlatformTransactionManager is present. "None of the above, if you use auto-configuration" was true.

Memory hook: @EnableXxx on a @Configuration class — never an attribute of @Configuration. And under Boot you don't write it at all.
Q17 · What @Transactional can configure

Four true: readOnly, rollbackFor, noRollbackFor, timeout

Your answer: "application exit code" and "callback on transaction failure". Neither is an attribute — and both describe things that live elsewhere in Spring.
AttributeTypeDefault
propagationenumREQUIRED
isolationenumDEFAULT
timeoutint seconds-1
readOnlybooleanfalse
rollbackFor / rollbackForClassNameclasses / strings
noRollbackFor / noRollbackForClassNameclasses / strings
transactionManager (alias value)bean namethe primary one

Where the two fake ideas actually live, which makes them easier to reject: exit codes are ExitCodeGenerator (a Boot concern); post-commit/post-rollback hooks are TransactionSynchronization, registered through TransactionSynchronizationManager. Both are real capabilities — just not attributes of this annotation.

And there is no retry attribute either — that's @Retryable from Spring Retry.

Memory hook: propagation · isolation · timeout · readOnly · the four rollback*For* · transactionManager. No callback, no exit code, no retry.

⑥ Testing 1 miss

Q31 · @DataJpaTest

Embedded DB · scans repositories · transactional — it does not load @Service or @Controller

Your answer: you ticked "it loads components like @Component, @Service, @Controller". That's the definition of a slice: it loads one layer.
LoadedNot loaded
@Entity classes@Component, @Service, @Controller
Spring Data repositoriesthe web layer
TestEntityManagerfull auto-configuration
DataSource + JpaTransactionManager

Two defaults it applies, both of which appear as their own questions: an embedded in-memory database replaces your configured one (disable with @AutoConfigureTestDatabase(replace = Replace.NONE)), and each test runs in a transaction that is rolled back afterwards.

The mirror of @WebMvcTest from yesterday's paper: each slice loads exactly one layer and mocks or omits the rest. If a slice question offers "it also loads services", that's the wrong answer by definition.

Memory hook: @DataJpaTest = JPA layer only, embedded DB, transactional + rolled back. Slices never load the layers above them.

⑦ Security 1 miss

Q45 · Authentication mechanisms identical to #11 Q17 — yesterday

Five are mechanisms; LDAP is a user store

Your answer: you ticked LDAP. Yesterday's review covered this exact question, with this exact distinction.
LayerAnswersMembers
Mechanismhow do credentials arrive?Basic · Digest · Form · X.509 · OAuth2/OIDC
User storewhere do the users live?LDAP · JDBC · in-memory

The reason this keeps catching you is that LDAP is the right answer to a neighbouring question. "Where can Spring Security store user details?" → JDBC, LDAP, in-memory. Same word, opposite verdict, depending on which layer the stem asks about.

So read the stem's noun. "Mechanism" / "how credentials are collected" ⇒ LDAP is out. "Store" / "where user details are kept" ⇒ LDAP is in.

In practice they combine: a Form login collects the credentials, and LdapAuthenticationProvider verifies them against the LDAP directory.

Memory hook: Mechanism = how credentials arrive. Store = where users live. LDAP is a store — and the right answer to the other question.

The 19 facts, one line each

Drill these, don't read them
The change to make before the next attempt (1) Drill, don't read. Four of these nineteen were already explained on this site, and one for the third time. Reading a review gives you recognition; the exam tests recall against four plausible options. The 30 questions on this page are worth more than re-reading any of it. (2) Rotate all four clinics — 20 minutes, before every attempt. Boot · Data · MVC 1 · 2 · 3. MVC is at 100% because you drilled it three times; Boot has fallen 86 → 75 → 61 because you drilled it once. The difference between those two lines is the whole lesson of this paper. (3) Say what you're hunting for. Eighth polarity slip (Q24). Five seconds per question. (4) Count your ticks. Eight marks went to multiple ticks on one-answer questions, including four ticks on Q37. Decide how many the stem wants before you look at the options. (5) Keep the clock going up. 41 minutes is better than 35, but you still have 89 minutes spare.
I'm your teacher — ask me anything. Say "drill the repeats" for a round built from the four questions you've missed more than once, "drill all four clinics" for the 20-minute rotation, or "quiz me on the 19" for this attempt. A Spring Core clinic is still the one section without one — point me at a Core topic bank whenever you're ready.
← Dashboard ← Review #11 Boot clinic MVC clinics