자동 의존성 주입(3/23/24)

-@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. 전체 응용 프로그램에 영향을 미치는 것.