본문 바로가기
유데미 스프링

지연 초기화, 즉시 초기화

by hoshi03 2024. 3. 20.

스프링의 기본 초기화는 즉시 초기화지만 어노테이션을 이용해서 초기화 시간을 조정할 수 있다

지연초기화를 쓸 일이 거의 없다고는 하지만 알아놓자

@Component
class classA{
    public classA(){
        System.out.println("class a!");
    }
}

@Component
class classB{

    private classA classA;

    public classB(classA classA){
        System.out.println("some logic");
        this.classA = classA;
    }
}

@Configuration
@ComponentScan
public class LazyInitializtion {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context
                = new AnnotationConfigApplicationContext(LazyInitializtion.class);
        String[] beanNames = context.getBeanDefinitionNames();
//        for (String x : beanNames) System.out.println(x);
    }
}

 

위 코드에서 class B 빈을 로드하거나 메서드에서 호출하지 않아도 자동으로 초기화 되면서

some logic이 출력된다

 

classA와 classB에 @Lazy 어노테이션을 붙이면 클래스들이 초기화되지 않아서 생성자가 호출되지 않는다

 

 


@Lazy
@Component
class classB{

    private classA classA;

    public classB(classA classA){
        System.out.println("some logic");
        this.classA = classA;
    }

    public void doSomething(){
        System.out.println("class B do something!");
    }
}

@Configuration
@ComponentScan
public class LazyInitializtion {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context
                = new AnnotationConfigApplicationContext(LazyInitializtion.class);
        System.out.println("initialization");
        context.getBean(classB.class).doSomething();
    }
}

 

이렇게 @Lazy 어노테이션이 달린 클래스 B는 메인에서 사용하기 직전에 초기화된다!

 

하지만 보통 상황에서는 Lazy를 쓰는 것보다 즉시 초기화하는걸 추천한다고 한다

지연 초기화를 하면 어플리케이션이 시작할때 스프링 구성 오류가 발생하지 않고 런타임에 오류가 발생하기에 치명적일 수 있다 

'유데미 스프링' 카테고리의 다른 글

PostConstruct, PreDestroy  (0) 2024.03.20
싱글톤, 프로토타입  (0) 2024.03.20
스프링 용어 정리  (0) 2024.02.25
의존성 주입  (0) 2024.02.24
Configuration , Bean, 컨테이너, 빈 연결 우선순위  (0) 2024.02.19