이번에는 Lazy와 Primary에대해 알아보자
Lazy는 말 그대로 게으른 걸 뜻한다.
코드로 확인하자

public class BeanClass {

}

위와 같은 코드가 있다고 가정하자
그리고 빈으로 등록하자

@Bean
public BeanClass beanClass(){
    System.out.println("register bean");
    return new BeanClass();
}

그런후에 테스트를 해보자.

@Test
public void lazyTest(){
    System.out.println("get bean before");
    BeanClass bean = applicationContext.getBean(BeanClass.class);
    System.out.println(bean);
}

그럼 결과는 당연히 register bean 부터 출력 될 것이다.
이번엔 Lazy어노테이션을 써보자

@Bean
@Lazy
public BeanClass beanClass(){
    System.out.println("register bean");
    return new BeanClass();
}

그리고 다시 테스트를 해보자
그럼 get bean before 출력 되고 getBean 호출시 빈으로 등록된다. (단 BeanClass를 DI 받으면 등록 되어 있다.)

이번엔 Primary를 알아보자.
말그대로 기본으로 등록 되는 빈을 말하는거다.
일단 같은 클래스를 빈으로 두개 등록하자.

@Bean
@Primary
public BeanClass beanClass(){
    BeanClass beanClass = new BeanClass();
    System.out.println("beanClass");
    System.out.println(beanClass);
    return beanClass;
}

@Bean
public BeanClass beanClass1(){
    BeanClass beanClass = new BeanClass();
    System.out.println("beanClass1");
    System.out.println(beanClass);
    return beanClass;
}

한개는 @Primary가 존재한다.

그리고 테스트를 해보자

@Test
public void lazyTest(){
    BeanClass bean = applicationContext.getBean(BeanClass.class);
    System.out.println(bean);
}

위와 같이 테스트를 해보면 항상 beanClass 가 빈으로 등록된다.
순서는 중요하지 않다.
먼저 등록이 되도 @Primary 있는 빈이 항상 등록된다.(기본으로)

BeanClass bean = (BeanClass) applicationContext.getBean("beanClass1");

물론 이렇게 하면 beanClass1이 나온다. 당연한 이야기 이지만..
만약 Primary없이 다시 해보자

BeanClass bean = applicationContext.getBean(BeanClass.class);

그럼 빈이 2개 존재 한다고 에러가 난다.
그럼 만약 둘다 Primary 존재 한다면 어떻게 될까?
마찬가지로 에러가 난다.

이렇게 @Lazy 와 @Primary에 대해 알아 봤다.