프로그래밍/Java

@Autowired 없어도 주입하는 방법

Jinwookoh 2025. 3. 2. 15:09

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가 주입됩니다.


✅ 결론

  1. 생성자가 하나만 있는 경우 @Autowired 없이 자동 주입됨.
  2. Lombok의 @RequiredArgsConstructor 사용 시 final 필드는 자동 주입됨.
  3. @Bean을 이용한 수동 설정 시 생성자 주입이 자동으로 이루어짐.
  4. XML 기반 설정을 사용할 경우 @Autowired 없이도 의존성 주입이 가능함.

Spring Boot 환경에서는 생성자 주입Lombok @RequiredArgsConstructor 조합을 많이 사용합니다. 이 방식을 권장하는 이유는 테스트 용이성불변성 유지 때문입니다.

'프로그래밍 > Java' 카테고리의 다른 글

빌더 (Builder) 클래스란?  (2) 2025.03.02
IntStream.rangeClosed  (1) 2025.03.02
자바 인터페이스의 세가지 유형 메소드  (0) 2025.03.02