• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

스프링 빈의 라이프사이클 내에서

21.10.14 21:03 작성 조회수 181

1

안녕하세요,

다른 분들의 질문을 참고해봐도 혼자서 이해하는게 너무 버거워서 질문을 남깁니다.

 

여기저기 출력문을 찍어보니

 

ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);

 

에서 "스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백" 까지 한번에 된다는 사실을 알았습니다.

 

public class BeanLifeCycleTest {

    @Test
    public void lifeCycleTest() {
        System.out.println("rmfjadjswptodtjdeh;a??1");
        ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
        System.out.println("rmfjadjswptodtjdeh;a??2");
        NetworkClient client = ac.getBean(NetworkClient.class);
        ac.close();
    }

    @Configuration
    static class LifeCycleConfig {
        @Bean
        public NetworkClient networkClient() {
            NetworkClient networkClient = new NetworkClient();
            //networkClient.setUrl("http://hello-spring.dev");
            System.out.println("stestesatestasetasetaset");
            return networkClient;
        }
    }
}

1. setUrl은 생성자 주입처럼 동시에 의존관계가 주입되는게 맞을까요??

2. 여기서 setUrl은  다른 분들의 질문을 보니 값 주입이라고 하던데 의존관계 주입이나 값 주입이나 비슷하다고 이해하고 넘어가면 될까요??

3. afterPropertiesSet() 은 따로 호출을 하지 않았는데, 어떻게 호출을 하는건가요??

4. 초기화 콜백은 '무조건' 호출이 되는 걸까요? 실제로 setUrl을 주석 처리해도 콜백함수가 호출이 됩니다.

 

질문이 조금 많지만 답변 부탁드립니다 ㅠㅠ

감사합니다.

답변 1

답변을 작성해보세요.

4

안녕하세요. lch9502님

1. setUrl은 생성자 주입처럼 동시에 의존관계가 주입되는게 맞을까요??

-> 스프링 컨테이너가 @Bean NetworkClient를 보고 NetworkClient 객체를 생성하기 위해서 networkClient()메서드를 호출합니다. 이 시점에 지금 코드에 보이는 것 처럼 

new NetworkClient()로 NetworkClient를 생성하고 다음 코드에서(지금은 주석이지만)

setUrl를 호출해서 url 값을 값 주입 합니다. 이것은 작성된 코드에서 발생하는 것입니다.

 

2. 여기서 setUrl은  다른 분들의 질문을 보니 값 주입이라고 하던데 의존관계 주입이나 값 주입이나 비슷하다고 이해하고 넘어가면 될까요??

-> 네 단순하게 객체를 주입하면 의존관계 주입이고, 값(String, int)를 주입하면 값 주입으로 이해하시면 됩니다.

 

3. afterPropertiesSet() 은 따로 호출을 하지 않았는데, 어떻게 호출을 하는건가요??

-> 스프링 컨테이너는 스프링 빈 중에 InitializingBean 인터페이스를 구현한 빈이 있으면 afterPropertiesSet()를 호출해줍니다. 스프링 컨테이너가 호출해주는 것으로 이해하시며 ㄴ됩니다.

 

4. 초기화 콜백은 '무조건' 호출이 되는 걸까요? 실제로 setUrl을 주석 처리해도 콜백함수가 호출이 됩니다.

3번을 참고해주세요.

감사합니다.

lch9502님의 프로필

lch9502

질문자

2021.10.17

답변 감사합니다!