스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이다.
빈(bean)은 인스턴스화된 객체를 의미한다.
스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
@Bean
이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
빈은 클래스의 등록정보, 게터/세터 메서드를 포함한다.
빈은 컨테이너에 사용되는 설정 메타데이터로 생성된다.
설정 메타데이터
XML 또는 자바 애너테이션, 자바 코드
로 표현한다.ApplicationContext
사용하여 bean 정의를 읽고 액세스할 수 있다.
// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
// retrieve configured instance
PetStoreService service = context.getBean("memberRepository", memberRepository.class);
// use configured instance
List<String> userList = service.getUsernameList();
getBean()
을 사용하여 bean의 인스턴스를 가져올 수 있다.
ApplicationContext
인터페이스는 bean을 가져오는 몇 가지 방법들이 있다.
실제적으로 응용 프로그램 코드에서는 getBean()
메서드로 호출하여 사용하면 안된다.
스프링은 다양한 설정 형식을 BeanDefinition
이라는 추상화 덕분에 지원할 수 있다.
BeanDefinition (빈 설정 메타정보)
@Bean
or <bean>
당 각 1개씩 메타 정보가 생성된다.BeanDefinition
인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML, Java
로 할 수 있다.Property |
---|
Class |
Name |
Scope |
Constructor arguments |
Properties |
Autowiring mode |
Lazy initialization mode |
Initialization method |
Destruction method |
BeanClassName : 생성할 빈의 클래스 명(자바 설정처럼 팩토리 역할의 빈을 사용하면 없음)
factoryBeanName : 팩토리 역할의 빈을 사용할 경우 이름, 예) appConfig
factoryMethodName : 빈을 생성할 팩토리 메서드 지정, 예) userService
Scope : 싱글톤(기본값)
lazyInit : 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때까지 최대한 생성을 지연처리 하는지 여부
InitMethodName : 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
DestoryMethodName : 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
Constructor arguments, Properties : 의존관계 주입에서 사용한다. (자바 설정처럼 팩터리 역할의 빈을 사용하면 없음)
References
Bean definition
을 만들 때 해당 Bean definition
에 의해 정의된 클래스의 실제 인스턴스를 만들기 위한 레시피를 만든다.
빈이 존재할 수 있는 범위를 의미한다.
특정 Bean 정의에서 생성된 개체에 연결할 다양한 의존성 및 구성 값뿐만 아니라 특정 Bean 정의에서 생성된 개체의 범위도 제어할 수 있다.
Spring Framework는 6개의 범위를 지원하며, 그 중 4개는 ApplicationContext를 사용하는 경우에만 사용할 수 있다.
Bean은 여러 범위 중 하나에 배치되도록 정의할 수 있다.
구성을 통해 생성하는 개체의 범위를 선택할 수 있기 때문에 강력하고 유연하다.
사용자 정의 범위를 생성할 수도 있다.
Scope | Description |
---|---|
singleton | (Default) 각 Spring 컨테이너에 대한 단일 객체 인스턴스에 대한 단일 bean definition의 범위를 지정한다. |
prototype | 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. |
request | 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다. |
session | 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다. |
application | 웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프이다. |
websocket | 단일 bean definition 범위를 WebSocket의 라이프사이클까지 확장한다. Spring ApplicationContext의 컨텍스트에서만 유효한다. |
클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.
스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다.
싱글톤 빈의 하나의 공유 인스턴스만 관리하게 된다.
private
생성자를 사용해 외부에서 임의로 new
를 사용하지 못하도록 막아야 한다.해당 Bean definition 과 일치하는 ID 또는 ID를 가진 빈에 대한 모든 요청은 스프링 컨테이너에서 해당 특정 빈 인스턴스를 반환한다.
스프링 컨테이너 종료 시 소멸 메서드도 자동으로 실행된다.
싱글톤 정리
싱글톤은 해당 빈의 인스턴스를 오직 하나만 생성해서 사용하는 것을 의미한다.
단일 인스턴스는 싱글톤 빈의 캐시에 저장된다.
이름이 정해진 빈에 대한 모든 요청과 참조는 캐시된 개체를 반환한다.
Bean 하나에 하나씩 메타 정보가 생성되고, 스프링 컨테이너는 이런 메타 정보를 기반으로 스프링 빈을 생성한다.
References