Summary
And there you have it, a blog implementation that leverages some of the cooler Athena features that in turn made the implementation easy and highly flexible. We used param converters to handle both deserializing the request body, and also looking up and providing a value from the database. We created a custom annotation and format handler to support multiple format responses via content negotiation. And most importantly, we scratched the surface of the DI component by showing how it makes reusing objects easy as well as how the container per request concept can be used to prevent the bleeding of state between requests.
As you can imagine, Athena leverages quite a few metaprogramming concepts in order to implement its features. In the next chapter, we are going to be exploring a core metaprogramming feature, macros.