스프링 컨테이너에 의해 생명주기가 관리되는 자바 객체를 의미한다.
기존 자바에서는 Class를 생성하고 new 키워드로 객체를 생성하여 사용하였지만 스프링에서는 new 키워드로 객체를 생성하는 것이 아니라 스프링 컨테이너에 의해 생성 및 관리당하는 Bean을 사용한다.
IoC 컨테이너 안에 들어있는 객체를 필요할 때마다 IoC 컨테이너에서 가져와 사용한다.
어노테이션인 @Bean
이나 xml 설정으로 일반 객체를 빈으로 등록할 수 있다.
Bean은 ApplicationContext가 알고 있는 객체로 ApplicationContext가 생성하고 직접 관리해주는 객체를 의미
빈 설정 메타정보
스프링은 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용한다.
속성에 따라 컨테이너가 빈을 어떻게 생성하고 관리할지 결정한다.
스프링 컨테이너는 설정 형식이 XML인지 Java 코드인지 모르고 BeanDefinition만 알면 된다.
@Bean
하나당 1개씩 메타 정보가 생성된다.
@Component
가 붙은 모든 클래스를 스프링 빈으로 등록해준다.
@Autowired 기능으로 생성자 의존성 주입에 필요한 설정 정보 대신 의존 관계 자동 주입을 해준다.
@Configuration
@ComponentScan
public class AutoDependencyConfig{
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration{
Component는 ElementType.TYPE 설정이 있어 Class 혹은 Interface에만 붙일 수 있다.
컴포넌트 스캔 시 @Configuration
코드에 @Component
애너테이션이 붙어있어 자동으로 등록된다.
기존에 작성한 AppConfig가 있다면 정상적인 작동이 되지 않는다.
탐색할 패키지의 시작 위치를 지정하고, 해당 패키지부터 하위 패키지 모두 탐색한다.
@ComponentScan
의 매개 변수로 basePackage =""을 선언할 수 있다.
기본은 @ComponentScan
이 붙은 설정 정보 클래스의 패키지이다.
스프링 부트를 사용하면 @SpringBootApplication
에 @ComponentScan
이 들어있으므로 @SpringBootApplication
을 프로젝트 시작 루트 위치로 두는 것이 좋다.
@Component
외에 @Controller
, @Service
, @Repository
, @Configuration
는 @Component
의 상속을 받으므로 전부 컴포넌트 스캔의 대상이다.
@Component
@Controller & @RestController
@Service
@Repository
@Configuration
@Bean
과 @Configuration
메서드가 스프링 컨테이너에서 관리할 새 객체를 인스턴스화, 구성 및 초기화한다는 것을 나타내는 데 사용한다
개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우 사용
빈을 등록하기 위해 인스턴스를 생성하는 메서드 위에 @Bean
을 명시하면 된다.
메서드 또는 어노테이션 단위에 붙임
@Configuration
public class AppConfig{
@Bean
public MemeberRepository memeberRepository(){
return new MemberRepository();
}
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
}
개발자가 직접 컨트롤이 가능한 클래스의 경우에 사용
클래스 또는 인터페이스 단위에 붙임
거의 사용하지 않지만 ApplicationContext를 호출하여 수동으로 설정 파일을 이용하여 빈을 수동 등록할 수 있다.
public class Main{
public static void main(String[] args){
ApplicationContext beanFactory = new AnnotationConfigApplicationContext(AppConfig.class);
AppConfig bean = beanFactory.getBean("appConfig", AppConfig.class);
}
}
bean definition을 만들 때 해당 bean definition에 의해 정의된 클래스의 실제 인스턴스를 만들기 위한 레시피를 만든다.
빈이 존재할 수 있는 범위를 의미한다.
특정 빈 정의에서 생성된 개체에 연결할 다양한 의존성 및 구성 값뿐만 아니라 특정 빈 정의에서 생성된 개체의 범위도 제어
구성을 통해 생성하는 개체의 범위를 선택할 수 있어 강력하고 유연하다.
사용자 정의 범위를 생성할 수 있다.
싱글톤 스코프는 스프링 컨테이너 안에서 한 번만 생성되며 컨테이너의 종료와 함께 소멸한다.
생성된 하나의 인스턴스는 싱글톤 빈 캐시에 저장되며 해당 빈에 대한 요청과 참조가 있을 때마다 캐시된 객체를 반환한다.
기본적으로 모든 빈은 스코프가 명시적으로 지정되지 않으면 싱글톤이다.
매번 동일하지 않은 새로운 빈이 필요한 경우에 사용
스프링 컨테이너가 생성과 의존관계 주입, 초기화까지만 관여하고 이후 프로세스는 관리하지 않는다. 즉 프로토 타입 빈의 모든 책임은 클라이언트가 가지게 된다.
싱글턴 스코프처럼 스프링 컨테이너가 생성부터 종료까지 관리해준다.
request, session, application, websocket 등의 스코프가 존재하고, 동작 과정은 비슷하다.