본문 바로가기
Spring

(Spring) 의존관계 자동주입

by windy7271 2022. 7. 10.
728x90
반응형

 

 

다양한 의존관계 주입 방법

1. 생성자 주입

2. 수정자 주입

3. 필드 주입

4. 일반 메서드주입

 

https://windy7271.tistory.com/149

 

(Spring) IoC / DI

IoC 기존 프로그램은 구현 객체가 스스로 필요한 구현 객체를 생성, 연결, 실행 하였다. 즉 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다. 객체 생성을 컨테이너에게 위임해서 처리하는

windy7271.tistory.com

 

 

옵션 처리

주입 할 스프링 빈이 없어도 동작해야할 때가 있다.

@Autowired 만 사용하면 required 값이 true 라 자동 주입 대상이 없으면 오류 발생

 

static class TestBean {

    @Autowired(required = false) // 의존관계가 없을때 false 면 호출도 안됨
    public void setNoBean1(Member noBean1) {
        System.out.println("noBean1 = " + noBean1);
    }

    @Autowired		// null 로 들어옴
    public void setNoBean2(@Nullable Member noBean2) {
        System.out.println("noBean2 = " + noBean2);
    }

    @Autowired		// 자바 8 문법 Optional.empty 로 넣어줌
    public void setNoBean3(Optional<Member> noBean3) {
        System.out.println("NoBean3 = " + noBean3);
    }
}

 

 

 생성자 주입을 쓰는게 가장 좋다  ... 왜??

 

- 대부분의 의존관계는 애플리케이션 종료전까지 변하면 안된다.

- 주입 데이터를 누락 했을때 컴파일오류가 나온다 (NPE)를 피할 수 있음

- final 키워드를 넣을 수 있다.

 

생성자주입 >>>> 수정자주입 >필드주입

 

필드주입 처럼 편하게 사용 하는법 > 롬복을 적용한다.

롬복 설치  >> intellij 에서 Annotation Processors 들어가서 Enabale annotaition processing 체크를 해줘야 가능.

 

@Getter
@Setter 

// 두개 해주면 밑에 코드를 알아서 생성해줌

private String name;
private int age;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

 

@RequiredArgsConstructor // final이 붙은걸 가지고 아래처럼 생성자를 만들어줌 

 

//    @Autowired  생략가능
//    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
//        this.memberRepository = memberRepository;
//        this.discountPolicy = discountPolicy;
//    }

 

 

조회 대상 빈이 2개 이상일 때 해결 방법

 

1.   @Autowired 필드명 매칭 

-  타입 매칭

-  타입 매칭의 결과가 2개 이상일 때 필드 명, 파라미터 명으로 빈 이름 매칭

 

2.  @Quilifier   끼리 매칭 > 빈 이름 매칭

Quilifier 이란 추가 구분자를 붙여주는 방법.  >> 빈 이름을 변경하는 것은 아니다.

@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy{
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("fixDiscountPolicy") DiscountPolicy discountPolicy) {
    this.memberRepository = memberRepository;
    this.discountPolicy = discountPolicy;
}

- 같은 Quilifier 를 찾아서 주입해줌

- 빈 이름 매칭

- 없으면 예외발생

 

3.  @Primary 사용

- 우선선위를 정하는 방법 @Autowired 시 여러 빈 매칭 되면 @Primary 가 우선권을 가진다.

 

메인 데베에서는 @Primary 서브 데베에서는 @Qualifier 를 지정해서 명시적으로 획득 하는 방식으로 사용하면 코드가 깔끔하다

 

Primary 는 기본 값처럼 동작 하고 Qualifuer는 상세하게 동작한다.    넓은범위<좁은범위      자동<수동

우선순위는 @Qualifier 가 우선권이 높다

 

 

조회한 빈이 모두 필요할때 List, Map

스프링을 사용하여 전략 패턴을 간단하게 구현

 

 

 

반응형

댓글