Spring's Java Config is a great way to configure your application without writing a lot of configuration code. One reason is those awesome @Enable* annotations that let you magically set up things like Transactions (@EnableTransactionManagement), Spring MVC (@EnableWebMvc) or timed jobs (@EnableScheduling) with a simple class level annotation on your configuration class. These simple statements provide a lot of functionality but their machinations are fairly obscure. On the one hand, it's great to get so much functionality for so little work, but on the other hand, if you don't understand how something works it makes debugging and problem solving much harder. I couldn't find any posts or documents that covered how those annotations work so I figured I would write up one based on the research I did while debugging. I don't work for Spring and I didn't write any of this code so please post any corrections or improvements in the comments and I'll update the post.