https://medium.com/@TheLittleProgrammer/a-comprehensive-guide-to-dependency-injection-in-java-7e623c3077a8