본문 바로가기
유데미 스프링

의존성 주입

by hoshi03 2024. 2. 24.

의존성 주입의 유형 3가지

 

생성자 기반, 수정자 기반, 필드 기반이 있다

 

@Component
class YourBusinessClass{

}

@Component
class Dependency1{

}

@Component
class Dependency2{

}

@Configuration
@ComponentScan
public class DepInjectionLauncherApplication {

    public static void main(String[] args) {

        try (var context =
                     new AnnotationConfigApplicationContext
                             (DepInjectionLauncherApplication.class)) {

            Arrays.stream(context.getBeanDefinitionNames())
                    .forEach(System.out::println);
        }
    }
}

 

클래스에 @Component 어노테이션을 붙여서 사용자가 만든 클래스를 빈으로 가져오고

메인에서는 추가 인자가 없는 @ComponentScan 어노테이션으로 현재 패키지에서 가져온 빈을 출력했다

이 상태로는 의존성 주입이 되지 않는다,  밑에서 의존성 주입을 해보자

 

필드 주입

@Component
class YourBusinessClass{
    @Autowired
    Dependency1 dependency1;

    @Autowired
    Dependency2 dependency2;

    public String toString() {
        return "using " + dependency1 + " and " + dependency2 ;
    }
}

 

필드에 바로 @Autowired 어노테이션을 사용하면 의존성을 주입해서 가져올 수 있다

이렇게 사용하는 방법은 생성자나 수정자가 없는 필드 주입이고, 테스트 코드가 아니면 사용을 권장하지 않는다

 

수정자 주입

@Component
class YourBusinessClass{
    Dependency1 dependency1;

    Dependency2 dependency2;

    @Autowired
    public void setDependency1(Dependency1 dependency1) {
        this.dependency1 = dependency1;
    }

    @Autowired
    public void setDependency2(Dependency2 dependency2) {
        this.dependency2 = dependency2;
    }

    public String toString() {
        return "using " + dependency1 + " and " + dependency2 ;
    }
}

 

setter 부분에 @AutoWired 어노테이션을 이용해서 수정자 주입을 했다

 

 

생성자 주입

@Component
class YourBusinessClass{
    Dependency1 dependency1;
    Dependency2 dependency2;

    @Autowired
    public YourBusinessClass(Dependency1 dependency1, Dependency2 dependency2) {
        this.dependency1 = dependency1;
        this.dependency2 = dependency2;
    }


    public String toString() {
        return "using " + dependency1 + " and " + dependency2 ;
    }
}

 

생성자를 만들때 @Autowired로 의존성 주입이 되게 했다

@Autowired가 없어도 모든 의존성을 가지고 생성자를 만들면, 여기서는 dep1, dep2 를 가지고 만들면

스프링에서 지원하기에 생성자 주입이 된다

 

모든 빈의 초기화가 하나의 메서드에서 가능하고, autowired를 사용하지 않을 수도 있는 생성자 주입을 사용하자

'유데미 스프링' 카테고리의 다른 글

PostConstruct, PreDestroy  (0) 2024.03.20
싱글톤, 프로토타입  (0) 2024.03.20
지연 초기화, 즉시 초기화  (0) 2024.03.20
스프링 용어 정리  (0) 2024.02.25
Configuration , Bean, 컨테이너, 빈 연결 우선순위  (0) 2024.02.19