Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

컴포넌트 스캔, 중복 등록, 충돌 본문

인프런/[인프런] Spring 핵심원리 이해

컴포넌트 스캔, 중복 등록, 충돌

Seung__ 2021. 7. 28. 22:03
  • 컴포넌트 스캔을 통해 같은 빈 이름을 등록하면?????
  • 자동 빈 등록 vs 자동 빈 등록
  • 수동 빈 등록 vs 자동 빈 등록

 

1. 자동 빈 등록 vs 자동 빈 등록


  • 컴포넌트 스캔을 통해 이미 등록되었는데, 또! 등록되면???
  • ConflictingBeanDefinitionException 발생
 

스프링 빈 설정 메타정보 - BeanDefinition

XML로 설정해보자아 1. Xml사용 스프링 부트 사용하면서 잘 사용안함... 레거시 프로젝트들이 xml로 되어있음. xml을 사용하면 컴파일 없이 빈 설정 정볼르 변경할 수 있다는 장점도 있음!! GenericXmlApp

bsh-developer.tistory.com

 

 

2. 수동 빈 등록 vs 자동 빈 등록


  • 현재 MemoryMemberRepository가 @Component를 통해 빈으로 등록된다.
    --> 빈 이름은 memoryMemberRepository

  • AutoAppConfig에 동일 이름을 가지는 빈을 추가하도록 설정하자.
    @Configuration
    @ComponentScan(
            //스캔에서 제외할 것 -->@ComponentScan도 @Component임, AppConfig나 TestConfig제외하기 위해.
            excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class),
            basePackages = "hello.core"
    
    )
    public class AutoAppConfig {
    
        @Bean(name = "memoryMemberRepository")
        MemberRepository memberRepository(){
            return new MemoryMemberRepository();
        }
    
    
    }​
  • 어찌될깡
  • 수동 등록 빈이 우선권을 가진다!!
  • 빈 이름이 memoryMemberRepository인 빈은 내가 수동으로 등록한 빈이다.
  • 수동 빈이 자동 빈을 오버라이딩 해벌임
     Overriding bean definition for bean 'memoryMemberRepository' with a different definition
     : replacing [Generic bean: class [hello.core.member.MemoryMemberRepository]​
  • 의도한거면 괜찮은데....대부분 설정이 꼬여서 이런 결과가 생긴다고 한다..
  • 굉장히.. 잡기 어려운 버그다..............애매한...버그....
  • 그래서 스프링 부트에서는 수동 vs 자동 상황이면 오류 발생하도록 바뀜!
    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    The bean 'memoryMemberRepository', 
    defined in class path resource [hello/core/AutoAppConfig.class], could not be registered. 
    A bean with that name has already been defined in file 
    [C:\\hello\core\member\MemoryMemberRepository.class] and overriding is disabled.
    
    Action:
    
    Consider renaming one of the beans or enabling overriding 
    by setting spring.main.allow-bean-definition-overriding=true

 

Comments