DevLogs/LearningSpring

JavaConfig 클래스에서의 Bean 취득 방법에 대한 정리

밥먹고해요 2024. 11. 26. 12:21

JavaConfig 클래스란?

@Configuration을 붙인 클래스를 말함

 

Bean 취득 방법

1. 인수 주입

@Configuration
public class UserServiceConfig {
    @Bean
    public UserService userService(UserRepository repository) { // (1)
    	return new SimpleUserService(repository);
    }
}

(1)에서와 같이, UserRepository 타입의 객체를 인수로 받도록 @Bean 메서드를 정의한다.

그러면, DI 컨테이너가 해당하는 객체를 인수로 주입해 준다.

만약, DI 컨테이너에 해당 타입의 객체가 없다면, 에러가 발생하므로 null을 주입받을 염려는 하지 않아도 된다.

2. @Bean 메서드 호출

@Configuration
public class UserServiceConfig {
    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }

    @Bean
    public SimpleUserService simpleUserService() {
    	return new SimpleUserService(userRepository()); // (1)
    }
    
    @Bean
    public AdminUserService adminUserService() {
    	return new AdminUserService(userRepository()); // (2)
    }
}

(1)과 (2)에서와 같이, @Bean 메서드를 직접 호출할 수 있다.

메서드를 직접 호출하기 때문에 메서드 호출로 반환된 UserRepository 객체가 서로 다를 것 같아 보이지만, DI 컨테이너가 Bean Scope 설정에 맞게 제공해 준다.

위 코드는, 기본값인 Singleton Scope이므로 (1)과 (2)에서 인수로 주입하는 객체는 동일한다.

만약, UserRepository를 Prototype Scope으로 설정했다면, (1)과 (2)에서 인수로 전달되는 객체는 서로 다르다.

3. 필드 주입

@Configuration
public class UserServiceConfig {
    @Autowired
    private UserRepository userRepository; // (1)

    @Bean
    public SimpleUserService simpleUserService() {
    	return new SimpleUserService(userRepository);
    }
    
    @Bean
    public AdminUserService adminUserService() {
    	return new AdminUserService(userRepository);
    }
}

(1)에서 붙은 @Autowired로 인해, DI 컨테이너가 필드 주입으로 UserRepository 타입의 객체를 주입해 준다.