NoUniqueBeanDefinitionException 에러 ..
477
작성한 질문수 1
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(http://bit.ly/3fX6ygx)을 먼저 확인해주세요.
3. 질문 잘하기 메뉴얼(http://bit.ly/2UfeqCG)을 먼저 읽어주세요.
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
예
[질문 내용]
여기에 질문 내용을 남겨주세요.
아래는 AutoAppConfigTest랑 AutoAppConfig 코드입니다..
public class AutoAppConfigTest {
@Test
void basicScan(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
OrderServiceImpl bean = ac.getBean(OrderServiceImpl.class);
MemberRepository memberRepository = bean.getMemberRepository();
System.out.println("memberRepository = " + memberRepository);
}
}
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
@Configuration
@ComponentScan (
basePackages = "hello.core", //여기 패키지부터 스캔
//basePackageClasses =
//컴포넌트 스캔중 뺄거 지정 (지정하지 않을시 default 현재 @ComponentScan이 붙은 설정정보 클래스의 package)
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
@Bean(name = "memoryMemberRepository")
MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
@Bean(name = "orderService")
public OrderService orderService(){
System.out.println("call AppConfig.orderService");
return new OrderServiceImpl(memberRepository(), discountPolicy());
//return null; ////필드주입
}
@Bean(name = "discountPolicy")
public DiscountPolicy discountPolicy(){
return new RateDiscountPolicy();
}
}
답변 2
0
넵
OrderService 인터페이스
package hello.core.order;
public interface OrderService {
Order createOrder(Long memberId, String itemName, int itemPrice);
}
OrderServiceImpl 클래스
package hello.core.order;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
//@RequiredArgsConstructor //lombok 생성자주입 (final 붙은 필드를 가지고 생성자를 자동으로 만들어준다)
@Component
public class OrderServiceImpl implements OrderService{
//필드주입
// @Autowired private MemberRepository memberRepository;
//
// @Autowired private DiscountPolicy discountPolicy;
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
//생성자 주입
@Autowired // 생성자 1개일시 쓰지않아도 됨
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) {
System.out.println("생성자호출");
this.memberRepository = memberRepository;
this.discountPolicy = rateDiscountPolicy;
}
//수정자 주입
// @Autowired
// public void setMemberRepository(MemberRepository memberRepository){
// this.memberRepository = memberRepository;
// }
//
// @Autowired
// public void setDiscountPolicy(DiscountPolicy discountPolicy){
// this.discountPolicy = discountPolicy;
// }
//메소드 주입입
// @Autowired
// public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy){
// this.memberRepository = memberRepository;
// this.discountPolicy = discountPolicy;
// }
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId,itemName, itemPrice, discountPrice);
}
public MemberRepository getMemberRepository() {
return memberRepository;
}
}
0
AppConfig의 oderService() 의 반환타입을 OrderService가 아니라 OrderServiceImpl로 변경해보시겠어요?
아래 답변을 참고하시면 좋을 것 같습니다.
섹션3. 11 회원객체 다이어그램
0
27
1
OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.
0
24
1
코드 자료
0
62
2
구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?
0
67
2
MemberService의 인터페이스를 왜 사용하는지 궁금합니다.
0
88
1
롬복 @Setter를 써야 하는 상황이 있는건가요?
0
97
1
빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?
0
83
1
테스트 속도가 나중에 영향이 있을까요?
0
84
1
gradle 설정 안떠서 질문 남깁니다!
0
129
2
build.gradle로 프로젝트를 여는 이유
0
93
1
provider 사용하는 이유
0
95
1
다음 강의 뭘 들어야 할까요
0
131
2
프로토타입 빈, 직접 destroy 호출 안 할 경우
0
66
1
beanB
0
85
2
퀴즈다시풀기
0
70
1
Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ
0
98
2
"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.
0
67
3
run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>
0
107
2
도메인의 정의?
0
60
1
ApplicationContext 질문입니다.
0
67
1
@Scope의 proxyMode를 사용할때 단위 테스트 방법
0
97
2
ai api 선정하기 관련 질문
0
125
2
생성자 자동주입 관련해서
0
68
1
생성자 직접 호출 vs 팩토리 메서드 패턴
0
99
2





