코드로배우는 스프링 웹 프로젝트

스프링특징과 의존성주입2-5

우주 코더 2018. 12. 12. 12:49

스프링 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
@ReauiredArgsConstructor 는 @NonNull이나 final이 붙은 인스턴스 변수에 대한 생성자를 만들어 냄.