스프링은 **스프링 애플리케이션 컨텍스트(spring application context)**라는 컨테이너를 제공한다.
이 컨테이너 내부에서 애플리케이션 컴포넌트 또는 **빈(bean)**들을 서로 연결하여 애플리케이션을 만든다.
빈의 상호 연결은 **의존성 주입(Dependency Injection, DI)**이라고 알려진 패턴을 기반으로 수행된다.
즉, 애플리케이션 컴포넌트에서 의존(사용)하는 다른 빈의 생성과 관리를 컨테이너에서 해주며, 추가로 모든 컴포넌트를 생성, 관리한다. 일반적으로 생성자 주입 또는 접근자 메서드(setter) 주입이 있다.
예를 들어, 재고 서비스와 제품 서비스가 있다고 가정하자.
제품 서비스는 제품에 대한 완전한 정보(재고 포함)을 제공하기 위해 재고 서비스에 의존한다.

이전의 스프링 버전에서는 컴포넌트 밑 다른 컴포넌트와의 관계를 XML 파일을 이용하여 빈을 상호 연결하도록 스프링 애플리케이션 컨텍스트에 알려주었다.
xml 예시
<bean id="inventoryService"
class="com.example.InventoryService" />
<bean id="productService"
class="com.example.ProductService" />
<contructor-arg ref="inventoryService" />
</bean>
자바 기반 구성 클래스 예시
@Configuration : 각 빈을 스프링 애플리케이션 컨텍스트에 제공하는 구성 클래스임을 나타냄