1. 생성자 주입 (Constructor Injection)
Spring 4.3 이후부터 클래스에 생성자가 하나만 존재하면 @Autowired 없이도 자동으로 의존성 주입이 가능합니다.
예제:
@Component
public class MyService {
private final DependencyService dependencyService;
// 생성자가 하나뿐이므로 @Autowired 없이도 자동 주입
public MyService(DependencyService dependencyService) {
this.dependencyService = dependencyService;
}
}
이 경우, Spring이 자동으로 DependencyService 빈을 찾아 주입해 줍니다.
2. 필드 주입 (Field Injection) + @Component
Spring Boot에서는 Lombok의 @RequiredArgsConstructor 를 사용하면 @Autowired 없이도 자동으로 필드 주입이 가능합니다.
예제:
@RequiredArgsConstructor
@Component
public class MyService {
private final DependencyService dependencyService; // final 필드 자동 주입
}
위 코드에서 @RequiredArgsConstructor 가 final 필드에 대한 생성자를 자동으로 생성해 주기 때문에, @Autowired 없이도 의존성이 주입됩니다.
3. @Bean 메서드를 통한 수동 주입
@Bean 메서드를 사용하여 수동으로 빈을 등록하면, 생성자 주입처럼 자동으로 주입될 수 있습니다.
예제:
@Configuration
public class AppConfig {
@Bean
public MyService myService(DependencyService dependencyService) {
return new MyService(dependencyService); // 생성자 주입
}
}
이렇게 하면 @Autowired 없이도 DependencyService가 MyService에 주입됩니다.
4. XML 기반 설정 (applicationContext.xml)
XML 기반 설정을 사용하면 @Autowired 없이도 주입이 가능합니다.
예제:
<bean id="myService" class="com.example.MyService">
<constructor-arg ref="dependencyService"/>
</bean>
<bean id="dependencyService" class="com.example.DependencyService"/>
이 경우, applicationContext.xml을 통해 MyService에 DependencyService가 주입됩니다.
✅ 결론
- 생성자가 하나만 있는 경우 @Autowired 없이 자동 주입됨.
- Lombok의 @RequiredArgsConstructor 사용 시 final 필드는 자동 주입됨.
- @Bean을 이용한 수동 설정 시 생성자 주입이 자동으로 이루어짐.
- XML 기반 설정을 사용할 경우 @Autowired 없이도 의존성 주입이 가능함.
Spring Boot 환경에서는 생성자 주입과 Lombok @RequiredArgsConstructor 조합을 많이 사용합니다. 이 방식을 권장하는 이유는 테스트 용이성과 불변성 유지 때문입니다.
'프로그래밍 > Java' 카테고리의 다른 글
빌더 (Builder) 클래스란? (2) | 2025.03.02 |
---|---|
IntStream.rangeClosed (1) | 2025.03.02 |
자바 인터페이스의 세가지 유형 메소드 (0) | 2025.03.02 |