프로그램의 흐름을 개발자가 직접 제어하는 것이 아닌 외부에서 제어 및 관리
프레임워크를 사용하면 객체의 생명 주기를 모두 프레임워크에 위임할 수 있다. 즉, 외부 라이브러리가 프로그래머가 작성한 코드를 호출하고, 흐름을 제어한다.
IoC는 클래스 간의 결합을 느슨하게 해 테스트와 유지 관리를 더 쉽게 하는 설계(design) 원칙이다.
IoC가 구현된 예는 다음 세 가지가 있다.
A 객체가 B객체의 메서드를 필요로 할 때 A클래스 안에 B클래스 생성자를 사용해 B의 인스턴스를 만들어 사용하는 대신, 의존성 주입은 다음 세 가지 방법 중 하나를 써서 B클래스가 A클래스에 주입되도록 한다.
서비스 로케이터 패턴에는 애플리케이션이 제공하는 모든 서비스에 대한 정보를 담고 있는 서비스 로케이터 객체가 있다. 인스턴스를 생성할 때 서비스는 서비스 로케이터에 자신을 등록한다. 클라이언트로부터 요청을 받으면 서비스 로케이터가 필요한 작업을 수행하고 필요한 값을 반환한다. 이 패턴 역시 의존 클래스 간의 결합을 느슨하게 한다.
개발자가 가지고 있어야 할 객체의 생명주기 제어권이 컨테이너에게 넘어갔다는 의미에서 제어가 역전되었다고 한다. 스프링 컨테이너는 프로그램 내 객체의 라이프사이클을 인스턴스로 만들어 관리한다. 사용자는 configuration 파일에서 애플리케이션에 필요한 객체 및 의존성에 대한 정보를 제공한다. 이 파일은 다음 세가지 중 하나일 수 있다.