Not a single mention of Guice or even dependency injection? Seems like a gaping omission in a guide that claims to be about "modern" Java.
Dependency injection is an abomination. Working on DI code feels like slogging through the post-processed expansion of some more elegant language. It's hard to understand control flow, and DI adds exciting failure modes to otherwise-correct code. Don't forget that DI also bloats class and method counts. Substitution for testability should be done at the runtime level, substituting class references as needed, instead…
That would require a Java agent. And that's a smell it its own right. (Cf JMockit)