스프링의 의존성 주입은 1) 생성자 주입, 2) Setter주입을 사용한다.
Setter주입은 setXXX()와 같은 메서드를 작성하고 (혹은 Lombok 으로 생성하고) @Autowired 어노테이션을 통해서 스프링으로 부터 자신이 필요한 객체를 주입해 주도록한다.
생성자 주입은 이러한 주입을 생성자를 통해처리.
Chef 라는 존재는 호텔에서도 필요하다고 가정
[ex00]
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.ToString;
@Component
@ToString
@Getter
public class SampleHotel {
private Chef chef;
public SampleHotel(Chef chef) {
this.chef = chef; //클래스변수 Chef는 매개변수로 받은 chef를 대입
}
}
->기존과 달리 생성자를 선언하고 Chef를 주입하도록 작성되었다.
기존과 다른점은 @Autowired 어노테이션 없이 처리되고 있다.
test실행코드
package org.zerock.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 HotelTests {
@Setter(onMethod_ = {@Autowired})
private SampleHotel hotel;
@Test
public void testExist() {
assertNotNull(hotel);
log.info(hotel);
log.info("---------------------------------");
log.info(hotel.getChef());
}
}
생성자 자동주입과 Lombok을 결합하면 SampleHotel은 아래와 같이 변경 할 수있다.
[jex00]
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.AllArgsConstructor;
import lombok.ToString;
@Component
@ToString
@Getter
@AllArgsConstructor // 인스턴스변수로 선언된 모든것을 파라미터로 받는 생성자를 자성
public class SampleHotel {
private Chef chef;
}
만일 여러개의 인스턴스 변수들 중에서 특정한 변수에 대해서만 생성자를 작성하고 싶다면
@NonNull과 @RequiredArgsConstructor 어노테이션을 이용 할 수 있다.
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
@Component
@ToString
@Getter
// @AllArgsConstructor // 인스턴스변수로 선언된 모든것을 파라미터로 받는 생성자를 자성
@RequiredArgsConstructor
public class SampleHotel {
@NonNull
private Chef chef;
}
@RequiredArgsConstructor는 @NonNull이나 final이 붙은 인스턴스 변수에 대한 생성자를 만들어낸다.
package org.zerock.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 org.zerock.config.RootConfig;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfig.class})
@Log4j
public class HotelTests {
@Setter(onMethod_ = {@Autowired})
private SampleHotel hotel;
@Test
public void testExist() {
assertNotNull(hotel);
log.info(hotel);
log.info("---------------------------------");
log.info(hotel.getChef());
}
}
'web' 카테고리의 다른 글
코드로 배우는 스프링 웹프로젝트 - 04 MyBatis와 스프링 연동 (0) | 2020.09.30 |
---|---|
코드로 배우는 스프링웹프로젝트 -JDBC테스트코드 (0) | 2020.09.29 |
코드로 배우는 스프링웹프로젝트 - 스프링과 Oracle Database연동 (0) | 2020.09.29 |
코드로 배우는 스프링웹프로젝트 02 (0) | 2020.09.29 |
코드로 배우는 스프링 웹프로젝트 01 (0) | 2020.09.28 |