1. 필드 주입
Field Injection
필드에 바로 의존 관계를 주입하는 방법이다.
@Autowired
가필드
에 붙어있다.코드가 간결해보이지만, 외부에서 변경이 불가능한 문제가 있다.
동작 과정
- 주입받으려는 빈의 생성자를 호출해서 빈을 찾거나 빈 팩토리에 등록한다.
- 생성자 인자에 사용하는 빈을 찾거나 만든다.
- 필드에 주입한다.
주입할 빈이 없어도 빈 생성이 가능하다. ➡️ 에러가 발생하지 않는다.
앱이 실행되고 testService에 접근할 때 NPE(NullPointerException) 발생
@Controller public class TestController { @Autowired private TestService testService; }
2. 생성자 주입
Constructor Injecton
생성자를 통해 의존 관계를 주입하는 방법이다. ➡️ 한 번만 호출되는 것을 보장
@Autowired
가생성자
에 붙어있다.해당 클래스에 생성자가 하나 밖에 없으면 @Autowired를 생략할 수 있다.
객체 생성 시점에 빈을 주입하기 때문에 주입할 빈이 없으면 에러가 발생한다. ➡️ 즉시 에러 확인 가능
주입 받을 필드에 final 키워드를 붙일 수 있다. ➡️ 불변성 보장
순환 참조를 방지할 수 있다.
@Controller public class TestController { private TestService testService; @Autowired public TestController(TestService testService) { this.testService = testService; } }
3. 수정자 주입
Setter Injection
필드 값을 변경하는 setter()를 통해 의존 관계를 주입하는 방법이다.
@Autowired
가setter()
에 붙어있다.필드 주입처럼 주입할 빈이 없어도 빈 생성이 가능하다. ➡️ 에러가 발생하지 않는다.
@Controller public class TestController { private TestService testService; @Autowired public void setTestService(TestService testService) { this.testService = testService; } }
결론
- 가장 좋은 방법은 생성자 주입 방식이다!