그렇다면 왜 Comment 인스턴스를 추가하지 않을까? 필자는 스프링 강좌를 강의할 때 이 질문을 자주 받는다. 프레임워크가 관리할 필요도 없는데 스프링 컨텍스트에 객체를 추가하면 앱에 불필요한 복잡성이 추가되어 앱의 유지 관리가 어려워지고 성능이 저하된다. 스프링 컨텍스트에 객체를 추가하면 프레임워크가 제공하는 특정 기능을 사용하여 객체를 관리할 수 있다. 프레임워크에서 얻는 이점도 없는데 스프링이 관리할 객체만 추가하는 것은 오버엔지니어링(over-engineering) 구현을 하는 것이다.
2장에서는 클래스가 프로젝트에 속해 있고 변경할 수 있다면 스테레오타입 애너테이션(@Component)을 사용하는 것이 스프링 컨텍스트에 빈을 추가하는 가장 편리한 방법이라고 설명했다. 여기에서도 이 방식을 사용할 것이다.
다음 그림에서 두 인터페이스가 흰색인 것을 볼 수 있다(@Component로 표시하지 않는다). 필자는 학생들이 구현에서 인터페이스를 사용할 때 스테레오타입 애너테이션을 어디에 사용해야 하는지 혼란스러워 하는 경우를 종종 보았다. 스프링이 인스턴스를 생성하고 이런 인스턴스를 컨텍스트에 추가하는 데 필요한 클래스에 스테레오타입 애너테이션을 사용한다. 인터페이스나 추상 클래스는 인스턴스화할 수 없기 때문에 스테레오타입 애너테이션을 추가하는 것은 의미 없다. 구문상으로는 이 작업을 수행할 수 있지만 유용하지 않다.