Spring Boot allows us to throw and listen to specific application events that we can process as we wish. Events are meant for exchanging information between loosely coupled components.
Dependency injection is a common approach to implement loose coupling among the classes in an application. There are different ways of injecting dependencies and this article explains why constructor injection should be the preferred way.
A peek into the system I use to organize my workday.
How can we avoid the dreaded Big Ball of Mud when developing software? This article gives an opinionated approach using packages and ArchUnit together with Spring to enforce clean boundaries between software components.