스프링특징과 의존성주입2-5
▶스프링 4.3 이후 단일 생성자의 묵시적 자동주입
스프링의 의존서주입=1)생성자주입 2)Setter주입을 사용.
Setter 주입 = setxxx()와 같은 메서드 생성 후 @Autowired와 같은 어노테이션을 통해 스프링으로 부터 자신이 필요한 객체를 주이바해 주도록 함.
생성자 주입= 이러한 주입을 생성자를 통해서 처리함.그리고 객체생성 시 의존성 주입이 필요하므로 좀 더 엄격하게 의존성 주입을 체크할 수 있는 장점이 있음.
기존에는 생서자를 정의하고 @Autowired와 같은 어노테이션을 추가해야만 생성자주입이 이뤄졌지만 ,스프링 4.3이후에는 묵시적으로 생성자주입이 가능.
얘제 Chef라는 존재는 호텥에서 필요하다고 가정하고 이를 코를 만들어 본다면 다음과 같은 구성.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package org.zeorck.sample; import org.springframework.stereotype.Component; import lombok.Getter; import lombok.ToString; @Component @ToString @Getter public class SampleHotel { private Chef chef; SampleHotel(Chef chef){ this.chef=chef; } } | cs |
생성자를 선언하고ㅠ Chef를 주입하고록 작성.Setter과 다른 점은 @Autowired없이 처리되고 있다는 점.
SampleHotel 테스트 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package org.zeorck.sample; import static org.junit.Assert.assertNotNull; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import lombok.Setter; import lombok.extern.log4j.Log4j; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") @Log4j public class HotelTest { @Setter (onMethod_= {@Autowired}) private SampleHotel hotel; @Test public void testExist() { assertNotNull(hotel); log.info(hotel); log.info("-----------------------------"); log.info(hotel.getChef()); } } | cs |
코드를 보시면 기존 Setter할때 와 동일 한 방법이다 .아래 보시면 의존성 주입이 일어 난것을 볼 수 있다 .
생성자의 자동 주입과 Lombok을 결합하면 SampleHotel은 변경 할 수 있음.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package org.zeorck.sample; import org.springframework.stereotype.Component; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; @Component @ToString @Getter @AllArgsConstructor public class SampleHotel { private Chef chef; } | cs |
@AllArgsConstructor는 인스턴스 변수로 선언된 모든 것을 파라미터로 받는 생성자를 작성하게 됩니다. (컴파일 결과에 생성자로 Chef를 받도록 만들어진 것을 알 수 있음)
만일 여러 개의 인스턴스 변수들 중에서 특정한 변수에 대해서만 생성자를 작성하고 싶으면 ,@NonNull,@ReauiredArgsConstructor을 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package org.zeorck.sample; import org.springframework.stereotype.Component; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.ToString; @Component @ToString @Getter @RequiredArgsConstructor public class SampleHotel { @NonNull private Chef chef; } | cs |