스프링 컨테이너, 스프링 빈

HUSII·2023년 1월 18일
0

스프링

목록 보기
3/8

(이전 장에서 이어진다.)
이제 스프링을 사용하여 DI 컨테이너를 구현해본다.

@Configuration
public class AppConfig {
	@Bean
	public Test test() {
    	return new Test(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepository() {
    	return new MemberRepository1();
    }
}

AppConfig에 설정을 구성한다는 뜻의 @Configuration을 붙여줬다.
메서드에 @Bean을 붙여준다. 이렇게 하면 스프링 컨테이너에 스프링 빈으로 등록된다.


스프링 컨테이너에 등록한 스프링 빈들을 사용해보자.

public class MemberApp {
	public static void main(String[] args) {
    	ApplicationContext ac = new
        	AnnotationConfigApplicationContext(AppConfig.class);
    	Test test1 = applicationContext.getBean(Test.class);
    }
}

ApplicationContext를 스프링 컨테이너라 한다.
기존에는 개발자가 AppConfig를 사용하여 직접 객체를 생성하고 DI를 했지만, 이제부터는 스프링 컨테이너를 통해서 사용한다.
스프링 컨테이너는 @Configuration이 붙은 AppConfig를 구성 정보로 사용한다.

여기서 Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
스프링 빈은 ac.getBean() 메서드를 사용해서 찾을 수 있다.

여기서 ApplicationContext는 인터페이스이다.
AnnotationConfigApplicationContext가 인터페이스의 구현체이다.

여기서 ApplicationContext를 스프링 컨테이너라 한다. BeanFactory도 스프링 컨테이너라 할 수 있다.
BeanFactory를 상속받은 것이 ApplicationContext
ApplicationContext는 BeanFactory뿐만 아니라 다양한 클래스를 상속받았다.

스프링 컨테이너의 생성 과정

  1. 스프링 컨테이너 생성
    new AnnotationConfigApplicationContext(AppConfig.class)
    스프링 컨테이너를 생성할 때에는 구성 정보를 지정해주어야 한다.
    여기서는 AppConfig.class를 구성 정보로 지정했다.

  2. 스프링 빈 등록
    스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈으로 등록한다.
    빈 이름은 메서드 이름을 사용한다.
    빈 이름을 직접 부여할 수도 있다.(@Bean(name="Testname")) - 빈이름은 겹치면 안됨

  3. 스프링 빈 의존관계 설정
    스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)한다.

참고: 스프링 빈을 생성하고, 의존관계 주입하는 단계가 나뉘어있다.
하지만 실제로는 한번에 처리된다.


스프링 빈을 조회하는 방법
ac.getBean(빈이름, 타입), ac.getBean(타입)
타입은 인터페이스나 구현 객체 둘다 가능하다. -> 구현 객체로 조회하는것은 유연성이 떨어짐

스프링 빈에 같은 타입이 있다면 컨테이너에 등록된 이름으로 구분할 수 있다.
그리고 부모 타입으로 빈을 조회하면, 자식 타입도 함께 조회한다.

profile
공부하다가 생긴 궁금한 것들을 정리하는 공간

0개의 댓글