-@Autowired 필드 이름 일치
@Autowired는 타입 매칭을 시도하고, 여러 개의 bean이 등록된 경우 추가로 bean 이름과 필드명, 파라미터명을 매칭한다.
@Autowired
private DiscountPolicy rateDiscountPolicy
-> 타입명 DiscountPolicy로 비교한 결과, FixDiscountPolicy와 RateDiscountPolicy 사이에 필드명 rateDiscountPolicy를 비교하였다.
-@한정자
추가 구분 기호를 추가하는 방법
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
비어 있는 경우 @Qualifier 추가
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
유형 이름 앞에 @Qualifier를 추가하기만 하면 됩니다.
-> @Qualifiers 일치 후 bean 이름과 일치, 일치하는 빈 이름이 없으면 NoSuchBeanDefinitionException 예외가 발생한다.
-@주요한
우선순위 지정 방법, @Primary가 우선합니다.
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
RateDiscountPolicy가 우선합니다.
@Primary는 기본적으로 작동하고 @Qualifier는 수동적으로 작동하므로 @Qualifier가 더 높은 우선순위를 갖습니다.
– 나만의 주석 만들기
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}
@MainDiscountPolicy라는 주석이 생성됩니다.
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {}
생성자를 자동으로 주입하려면:
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,@MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Qualifier와 유사하게 유형 이름 앞에 추가하기만 하면 됩니다.
-검색된 모든 콩이 필요한 경우 나열, 매핑(검색된 콩 중에서 선택)
public class AllBeanTest {
@Test
void findAllBean() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
int discountPrice = discountService.discount(member, 10000,
"fixDiscountPolicy");
assertThat(discountService).isInstanceOf(DiscountService.class);
assertThat(discountPrice).isEqualTo(1000);
}
static class DiscountService {
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies;
public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
this.policyMap = policyMap;
this.policies = policies;
System.out.println("policyMap = " + policyMap);
System.out.println("policies = " + policies);
}
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
System.out.println("discountCode = " + discountCode);
System.out.println("discountPolicy = " + discountPolicy);
return discountPolicy.discount(member, price);
}
}
}
DiscountService는 모든 DiscountPolicy(rate,fix)를 Map에 삽입합니다.
할인 방법은 fixDiscountPolicy가 디스크 인코딩에 전달될 때 맵에서 fixDiscountPolicy를 찾아 실행합니다.
->이렇게 모든 빈을 등록한 후 그 중에서 선택하시면 됩니다.
자동 기능을 기본으로 사용하는 것이 좋지만 기술 지원 개체를 수동으로 등록하십시오. B. 전체 응용 프로그램에 영향을 미치는 것.