인프런 커뮤니티 질문&답변
생성자 주입의 경우엔 @Autowired(required=false)를 쓸 수 없는건가요?
해결된 질문
작성
·
2.4K
5
안녕하세요 최고의 강의 항상 잘 듣고 있습니다 : )
궁금한게 있어 질문드립니다
@Autowired(required=false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨
라고 강의에서 언급하셨는데, 생성자 같은 경우엔 @Autowired(required=false)가 붙어도 호출이 되고 (required=false)가 적용되지 않는 것 같습니다
실제로 빈으로 등록되지 않은 것을 필드로 두고 @Autowired(required=false)를 적용해보니 UnsatisfiedDependencyException이 터졌습니다.
빈 컨테이너의 의존성 주입 단계에, setter가 없더라도 컨테이너가 setter를 만들어서 setter를 통해 주입하는건가요?
다만 생성자 주입같은 경우엔 빈을 생성하는 과정에서 생성자가 호출되어 싱글톤 패턴으로 빈을 주입하게 되고, setter를 통한 빈 주입 단계에는 주입이 되지 않는건가요?
언제나 감사합니다!
퀴즈
필드 주입(Field Injection) 방식이 일반적으로 권장되지 않는 이유는 무엇일까요?
불변성을 보장하기 어려워서
의존성 변경이 쉬워서
순수 Java 코드로 테스트하기 어려워서
설정 코드 작성이 복잡해서
답변 1
12
안녕하세요. 재량님
생성자 주입의 경우에는 @Autowired(required=false)가 적용되지 않습니다. 대신 개별 필드에 값이 없을 때도 허용하고 싶으면 다음과 같이 사용하시면 됩니다.
package com.example.constructautowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
@Component
public class TestBean {
private final Member member;
@Autowired
public TestBean(@Autowired(required = false) Member member) {
System.out.println("member = " + member);
this.member = member;
}
}
또는 @Nullable, Optional등을 사용하시면 됩니다.
package com.example.constructautowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
@Component
public class TestBean {
private final Member member;
@Autowired
public TestBean(@Nullable Member member) {
System.out.println("member = " + member);
this.member = member;
}
}
감사합니다.





