자바 객체의 생명 주기를 관리하며 추가적인 기능을 제공한다.
즉 빈(Bean)의 인스턴스화, 구성, 전체 생명 주기 및 제거까지 관리한다.
컬렉션 프레임워크와 같이 여러 인터페이스가 계층적으로 존재한다.
스프링 컨테이너가 관리하는 자바 객체
빈은 스프링 컨테이너에 등록되어 의존성을 주입 받는다.
@Configuration
public class AppConfig{
@Bean
public UserRepository userRepository(){
return new UserRepository();
}
@Bean
public UserService userService(){
return new UserService(userRepository());
}
}
위처럼 @Bean 어노테이션을 이용해 메서드가 반환한 객체를 스프링 컨테이너에 bean으로 등록할 수 있다.
기본적으로 메서드명을 빈의 이름으로 등록하지만 @Bean(="[beanName]")로 빈의 이름을 설정할 수 있다.
코드로 직접 빈을 등록하는 방식이다.
⚠️@Bean을 붙인 메서드는 무조건 객체를 반환해야 한다.
@Component 어노테이션을 포함하는 클래스를 찾아 빈으로 등록해준다.
@ComponentScan([pakage] = ["경로"])를 구성 클래스의 최 상단에 붙인다.
@SpringBootApplication어노테이션 내에 포함되어서Application을 실행할때 자동으로ComponentScan을 실행하여 빈을 등록시킨다.
우선 결론적으로 주입이 불가하다. 그렇기 때문에 @Primary @Qualifier 어노테이션을 사용해서 우선 순위를 부여해주어야 한다.
같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어있다면 Qualifier의 우선순위가 더 높다. 하지만 Qualifier는 적용하기 위해서 주입 받고자하는 곳에 해당 Qualifier를 반드시 추가해야한다.
public interface Car {
public void run();
}
@Component
@Primary
public class Kia implements Car {
public void run() {
System.out.println("spotage run");
}
}
@Component
@Qualifier("hyundai")
public class Hyundai implements Car {
public void run() {
System.out.println("avante run");
}
}
public class CarService {
@Autowired
@Qualifier("hyundai")
private Car car;
}
이렇게 되면 car는 Hyundai 클래스로 주입이 된다.
따라서 같은 타입의 Bean이 여러 개 있을 때는 범용적으로 사용되는 Bean 객체에는 Primary를 설정하고 지엽적으로 사용되는 Bean 객체에는 Qualifier를 사용하는 것이 좋다.
빈 객체가 존재할 수 있는 범위를 나타낸다.
빈이 생성될 때 기본적으로 가지는 스코프이다.
Singleton 패턴이란?
- 인스턴스가 하나만 생성되도록 보장하는 패턴
- 메모리 효율성이 좋아짐
- 시간 절약
- 스프링 컨테이너는 빈을 싱글톤으로 관리한다.
빈 요청 시마다 새로운 인스턴스 생성
HTTP 세션 마다 새로운 빈 인스턴스 생성
HTTP 요청 마다 새로운 빈 인스턴스 생성
스프링 컨테이너의 최상위 인터페이스

getBean(String name)
getBean(Class <T> requiredType)
getBean(String name, Class <T> requiredType)
빈 등록, 생성, 조회 등의 빈 관리 역할을 수행한다.
BeanFactory를 상속 받아 부가적인 기능을 추가한 인터페이스