Spring Snippet - Spring Core에서 패키지경로를 통해 ApplicationContext 얻을 때 주의사항

상황

  • main.java 파일
ApplicationContext context = new AnnotationConfigApplicationContext("com.blidkaga");
UserRepository userRepository = context.getBean(UserRepository.class);
  • UserRepositoryImpl 파일
package com.blidkaga.repository;

import com.blidkaga.model.User;
import org.springframework.stereotype.Component;

@Component
public class UserRepositoryImpl implements UserRepository {

    @Override
    public User save(User user) {
        return user;
    }

    @Override
    public int countByUsername(String username) {
        return 1;
    }
}

  • jar 실행 시아래와 같은 에러 발생

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.blidkaga.repository.UserRepository' available: expected single matching bean but found 2: userRepositoryImpl,userRepository

원인

  • ApplicationContext context = new AnnotationConfigApplicationContext("com.blidkaga"); 실행 시 @Configuration 어노테이션이 걸려 있는 파일의 Bean도 중복으로 등록되었기 때문

  • AppConfig.java
  • DI 컨테이너에 userRepositoryuserRepositoryImpl이 두 개가 등록되면서 생긴 문제
@Configuration
public class AppConfig {
    @Bean
    UserRepository userRepository(){
        return new UserRepositoryImpl();
    }

   ... 생략

}