대부분의 응용 프로그램 시나리오에서 컨테이너의 대부분의 bean은 singleton 입니다. 싱글 톤 빈이 다른 싱글 톤 빈과 협업해야하거나 싱글 톤이 아닌 빈이 다른 싱글 톤이 아닌 빈과 협업해야하는 경우 일반적으로 빈을 다른 빈의 프로퍼티로 정의하여 의존성을 처리합니다. 빈의 수명주기(라이프사이클)이 다른 경우 문제가 발생합니다. 싱글 톤 빈 A가 싱글톤이 아닌 A (프로토 타입) bean 을 사용할 필요가 있다고 가정하십시오. 아마 각 메서드 호출은은 A에서 발생합니다. 컨테이너는 싱글톤 빈 A를 한 번만 생성하므로 프로퍼티를 설정할 수있는 기회도 한 번만 있습니다. 컨테이너는 빈 B가 필요할 때마다 b빈 B의 새 인스턴스를 가진 빈A를 제공 할 수 없습니다.
해결책은 제어의 역전(inversion of control)을 막는 것입니다. ApplicationContextAware인터페이스 를 구현함으로써 빈 A가 빈B를 필요로 할 때마다 컨테이너가 (일반적으로 새로운) 빈 B 대한 getBean("B")호출을 하게 함으로써 빈 A가 컨테이너 를 인식하게 할 수 있으며 다음 예제에서는이 접근 방식을 보여줍니다.
// 어떤 프로세싱을 수행하기 위해 상태가 있는 커맨드 스타일의 클래스를 사용하는 클래스packagefiona.apple;// 스프링 API 임포트importorg.springframework.beans.BeansException;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;publicclassCommandManagerimplementsApplicationContextAware{privateApplicationContext applicationContext;publicObjectprocess(MapcommandState){ // 적절한 Command의 새로운 인스턴스를 붙잡는다Command command =createCommand(); // (원컨대 완전히 새로운) Command 인스턴스에 상태를 설정한다command.setState(commandState);returncommand.execute();}protectedCommandcreateCommand(){ // 스프링 API 의존성에 주의해라!returnthis.applicationContext.getBean("command",Command.class);}publicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{this.applicationContext= applicationContext;}}
앞의 예제는 비즈니스 코드가 스프링 프레임 워크를 인식하고 결합하기 때문에 바람직하지 않습니다. Spring IoC 컨테이너의 다소 고급 기능인 메소드 삽입 (Method Injection)을 통해이 유스 케이스를 깔끔하게 처리 할 수있다.
이 블로그 엔트리 에서 Method Injection에 대한 동기를 더 읽을 수 있습니다 .