
@Repository, @Service, @Controller 등의 어노테이션은 @Component를 이미 포함한다.
클래스의 생성자에 @Autowired를 붙여 해당 클래스 타입의 필드들을 찾아 등록하도록 한다.
👇🏻등록된 Class2의 빈을 알아서 찾아와 주입한다. 생성자가 하나일 경우 어노테이션을 붙이지 않아도 해당 생성자를 자동 주입의 대상으로 인식한다.

메서드에 @Autowired를 붙여 해당 클래스 타입의 빈을 찾아와 의존성을 주입한다.
cf. 생성 시점 이후에 메서드를 호출하여 의존성을 변경할 수 있으나,
필드가 외부에서 변경될 수 있다는 점과 의존성이 필요한 시점에 주입되지 않을 수 있다는 위험이 존재

필드에 @Autowired를 붙여 의존성을 주입
cf. 수정자 주입과 마찬가지로 필드가 final이 아니므로 변경될 여지가 있다. 메서드와 필드 주입 시의 메서드, 필드의 접근제어자는 private도 가능

생성자 주입은 수정자 주입, 필드 주입보다 여러 장점을 가진다.
1. 필수적인 의존성의 주입 시점을 보장할 수 있다.
2. 필드를 final로 선언이 가능하여 외부에서의 변경 가능성을 낮춘다.
3. 의존성 주입이 한 곳(생성자)에서만 일어나므로 필요한 의존성을 한곳에서 모아서 확인할 수 있다.
4. 순수 자바 코드로의 테스트가 용이하다.
5. Bean의 순환 참조 문제를 방지할 수 있다.