TF_JW
246
2018-12-04 20:51:43 작성 2018-12-04 20:54:24 수정됨
2
137

(초보) @autowired된 변수를 다른변수에서 호출하면 null 되는 이유가 궁금합니다.


안녕하세요 선배님들, 개발중에 궁금한게 생겨서 질문합니다.


@Autowired
private ConfigProfile configProfile;


private String var1=configProfile.getIpAddress();


위와같이 String 변수에서 호출했을때 해당코드에서 NullPointerException 에러가 나는데 왜 그런지가 궁금합니다.

아래와 같이 바로 사용할때는 에러가 나지않습니다.


 

@Autowired
private ConfigProfile configProfile;

public void BBB() {
    System.out.println(configProfile.getIpAddress());
}


@Autowired된 변수를 String 변수에서 호출하여 가공하려는데 String변수에서 널포인트에러가 왜나는지 궁금합니다.

0
0
  • 답변 2

  • 엔카나
    319
    2018-12-04 21:32:48

    자동 주입을 실행하는 시점에 차이가 있기 때문입니다.

    우선 자동주입코드가 포함된 클래스의 인스턴스를 먼저 생성하는데, 이 과정에서 각 필드를 초기화하지 않고 선언만 했을 경우 디폴트 값을 저장합니다.

    코드에선 Reference Type 의 필드이기 때문에 null 이 저장되죠.

    그리고 리플렉션을 이용해서 인스턴스 내에 존재하는 (+@Autowired 어노테이션이 붙어있는) 맴버들에 대해서 자동주입을 시작합니다.

    이런 과정을 생각해보면, config.get() 코드를 실행하는 시점은 config에 의존주입이 된 이후가 아니라 그 전이죠.

    따라서, config.get() 은 곧 null.get() 이 되는겁니다.


    두번째 코드는 메소드 내에서 실행하기 때문에 예외가 발생하지 않는겁니다.

    메소드는 인스턴스의 생성이 끝나고 자동주입까지 끝난 이후에 호출할 수 있기 때문에 (JVM이 메소드 내의 코드들을 실행하는 시점은 해당 메소드가 호출될 때 이기 때문이기도 하죠.) 메소드 내에서의 config.get() 을 실행할때는 config에 의존 객체가 주입되어 있는 상태입니다.

    1
  • TF_JW
    246
    2018-12-04 22:59:08 작성 2018-12-04 23:12:33 수정됨

    엔카나 // 


    일반변수와 같은시점으로 바로 의존주입되어 인스턴스화 된다고 


    제가 잘못생각했기 때문에 그런거군요


    저한텐 좀 어려운 내용이긴한데 계속 보면서 이해해보도록 하겠습니다.


    답변 너무 감사드립니다.


    ---




    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.