Spring DI 종류
본문 바로가기
Spring

Spring DI 종류

by IYK2h 2022. 4. 22.
728x90

1. 생성자 주입

생성자에 파라미터를 만들어두고 이를 통해 DI 컨테이너가 의존할 오브젝트 레퍼런스를 넘겨주는 방식

// PicoContainer
class MovieLister...
    public MovieLister(MovieFinder finder) {
        this.finder = finder;       
    }
​
class ColonMovieFinder...
    public ColonMovieFinder(String filename) {
        this.filename = filename;
    }

무의식 중에 가장 많이 쓰는 주입 방식

객체 생성시 필수로 생성자가 실행되기 때문에, 필드 주입과 달리 참조 관계를 눈으로 쉽게 확인할 수 있다.

2. Setter 주입

의존성을 입력받는 세터 메소드를 만들고 이를 통해 의존성을 주입

// Spring Container
class MovieLister...
    private MovieFinder finder;
    public void setFinder(MovieFinder finder) {
        this.finder = finder;
    }
​
class ColonMovieFinder...
    public void setFilename(String filename) {
        this.filename = filename;
    }

settet()메소드는 외부에서 오브젝트 내부의 attribute값을 변경하려는 용도로 주로 사용

파라미터로 전달된 값을 내부의 인스턴스 변수에 저장하며 스프링에서 지지하는 DI방식이다.

외부에서 제공받은 오브젝트 레퍼런스를 저장해뒀다가 내부의 메소드에서 사용하게 하는 DI방식에서 활용하기에 적합

3.필드 주입

우리가 흔히 쓰는 가장 직관적이며 간편한 방법이다.

class MovieLister...
    private MovieFinder finder;
    public void setFinder(MovieFinder finder) {
        this.finder = finder;
    }
​
class ColonMovieFinder...
    @Autowired
    public void setFilename(String filename) {
    }

위와 같이 자신의 내부에 놓고 주입하는 방식을 말한다. 간편하지만 참조 관계를 직관적으로 확인하기 어렵다. 참조 관계가 꼬일 수 있으니 주의

@Autowired?

스프링은 @Autowired(의존성을 자동 연결)를 이용하여 자동 DI를 만들어낸다.

@Bean
class A {}
​
@Bean
class B {
   @Autowired
   private B b;
}

즉, Bean으로 등록된 A 객체를 B 객체가 Bean으로 등록되기 전에 미리 값을 넣어주는 방식

스프링 버전이 높아지면서, @Autowired가 점점 생략되는 추세

4. 초기화 인터페이스를 이용한 의존성 삽입 (스프링 지원X)

의존성을 주입하는 함수를 포함한 인터페이스를 작성하고 이 인터페이스를 구현하도록 함으로써 실행시에 이를 통하여 의존성을 주입

// Avalon
public interface InjectFinder {
    void injectFinder(MovieFinder finder);
}
​
class MovieLister implements InjectFinder...
    public void injectFinder(MovieFinder finder) {
        this.finder = finder;
    }
​
public interface InjectFinderFilename {
    void injectFilename (String filename);
}
​
class ColonMovieFinder implements MovieFinder, InjectFinderFilename......
    public void injectFilename(String filename) {
        this.filename = filename;
    }

가장 먼저 Injection을 하기 위한 인터페이스를 정의한 후, 구현하면 DI가 이루어지도록 한다.

728x90

'Spring' 카테고리의 다른 글

Spring-Core Container  (0) 2022.05.13
Java Bean? Spring Bean?  (0) 2022.04.29
Spring IoC, DI 가 무엇인지  (0) 2022.04.19
Spring-JPA-hibernate.naming  (0) 2022.03.22
Filtet vs Interceptor  (0) 2022.03.18

댓글