[스프링(spring)]의존관계 자동 주입

allnight5·2023년 2월 13일
0

스프링

목록 보기
49/62

1.다양한 의존 관계 주입 방법

1-1.생성자주입
1-2.수정자주입(setter주입)
1-3.필드주입
1-4.일반 메서드주입

1-1.생성자주입

특징
- 생성자 호출시점에 딱 1번만 호출되는것이 보장된다.
- 불변, 필수 의존관계에 사용

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
    @Autowired
    public OrderServiceImpl(DiscountPolicy discountPolicy) { 
        this.discountPolicy = discountPolicy;
    }

생성자가 1개라면 @Autowired를 생략해도 자동주입된다.

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
 
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    } 

1-2.수정자주입(setter주입)

setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해 의존관계를 주입하는 방법이다.
선택 변경 가능성이 있는 의존관계사용

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
 @Autowired(required = false)
 	public void setMemberRepository(MMemberRepository memberRepository){
    	this.memberRepositoy = memberRepository;
    }
    
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    } 

빈이름은 메서드이름을 사용하지만 직접 부여할수도있다.
MemberService -> memberService 앞의 대문자는 소문자로 바뀐다 잊어버리지말자
@Bean(name ="memberService")

있을때만 등록되게 선택적으로 하려면
@Autowired(required = false)게 입력해주면된다.
그러면 있어도되 없어도 되라고 된다고한다.

1-3.필드주입

@Autowired private MemberRepository memberRepository;
@Autowired 
private MemberRepository memberRepository;

외부에서의 변경이 불가능해서 테스트하기 힘들고 DI프레임워크가없으면 아무것도할수없다.
개다가 변경하려면
setter를 따로 만들어줘야하는데
그럴거라면 그냥 setter만 따로 만드는것이 좋다.

실제로는 사용하지않는것이 좋다
스프링 설정을 목적으로 하는 @Configuration이나
실제코드와 관계없는테스트 코드에서는 사용해도된다.

1-4.일반 메서드주입

public class OrderServiceImpl implements OrderService{
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

이렇게 클래스명과 생성자 명이 같아야 하는데

public class OrderServiceImpl implements OrderService{
    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

    @Autowired
    public newMethod(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

이런식으로 일반 이름의 메서드를 통해서 주입하는것으로
한번에 여러필드를 주입받을수있다.

그리고 스프링빈안에서만 동작한다.

profile
공부기록하기

0개의 댓글