DI, 의존성 주입이란 컨테이너에서 관리할 객체를 지정해주고, 코드내에서 컨테이너에서 생성된 객체를 받아서 사용하는 방식이다. 빈을 정의할때 객체간의 의존 관계를 명시해 코드에서 사용시 자동으로 주입받도록 한다.
DI는 개발자가 컨테이너에서 관리될 객체를 지정해줄 때 의존객체를 지정해주는 작업을 의미한다.
일반적으로 처음에 배우는 자바 프로그램에서는 각 객체들이 프로그램의 흐름을 결정하고 각 객체를 직접 생성하고 조작하는 작업(객체를 직접 생성하여 메소드 호출)을 했습니다. 즉, 모든 작업을 사용자가 제어하는 구조였습니다. 예를 들면, 생성할 객체를 직접 다 new를 해주고 메소드 호출도 직접 필요한때에 코드로 넣어 주었죠.
하지만 IOC가 적용된 경우, 객체의 생성을 특별한 관리 위임 주체에게 맡깁니다. 이 경우 사용자는 객체를 직접 생성하지 않고, 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 됩니다. 즉, 사용자의 제어권을 다른 주체(Spring)에게 넘기는 것을 IOC(제어의 역전) 라고 합니다.
Spring IoC 컨테이너가 관리하는 자바 객체를 빈이라고 부릅니다. 제어의 역전으로 인해 객체에 대한 권한이 스프링에 위임되어서 스프링에 의해 생성되고 관리되는 자바 객체들을 Bean이라고 부릅니다. Spring Framework 에서는 Spring Bean 을 얻기 위하여 ApplicationContext.getBean() 와 같은 메소드를 사용하여 Spring 에서 직접 자바 객체를 얻어서 사용합니다.