Spring Beans and Dependency Injection

Spring Beans and Dependency Injection

Spring Beans와 의존성 주입

빈을 정의하고 의존성을 주입하기 위해 Spring Framework의 표준 기술을 자유롭게 사용할 수 있습니다. 일반적으로 의존성을 연결하기 위해 생성자 주입을 사용하고, 빈을 찾기 위해 @ComponentScan을 사용하는 것을 권장합니다.

위에서 제안한 대로 코드를 구성하면(애플리케이션 클래스를 최상위 패키지에 위치시키면), 인자 없이 @ComponentScan을 추가하거나 이를 암시적으로 포함하는 @SpringBootApplication 어노테이션을 사용할 수 있습니다. 모든 애플리케이션 컴포넌트(@Component, @Service, @Repository, @Controller 등)는 자동으로 Spring Bean으로 등록됩니다.

다음 예제는 필수 RiskAssessor 빈을 얻기 위해 생성자 주입을 사용하는 @Service Bean을 보여줍니다:

import org.springframework.stereotype.Service;

@Service
public class MyAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    public MyAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...
}

빈에 생성자가 둘 이상 있는 경우, Spring이 사용할 생성자에 @Autowired를 표시해야 합니다:

import java.io.PrintStream;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    private final PrintStream out;

    @Autowired
    public MyAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
        this.out = System.out;
    }

    public MyAccountService(RiskAssessor riskAssessor, PrintStream out) {
        this.riskAssessor = riskAssessor;
        this.out = out;
    }

    // ...
}

생성자 주입을 사용하면 riskAssessor 필드를 final로 표시할 수 있어, 이후에 변경할 수 없음을 나타낼 수 있습니다.