Well, in my opinion, it's just as computationally efficient to use the RecipeManager and scrap the reload listener as it pretty much is a simple stateless filter. The only benefit here is a transition from O(n) -> O(k) where n is the number of recipes while k is the number of specific recipes. So, it all depends on if you want to cache your data, which still doesn't technically need a reload listener.
Yes. You can technically invalidate cache without the need of a reload listener. However, I will not argue nor complain that the current implementation isn't okay as well. It's just better if you understand the reason why compared to using just a simple baseline.