[3] 스프링 빈과 의존 관계

JIN·2021년 12월 8일
0

DI 는 @annotation 과 Autowired 를 통해 이루어짐

스프링 빈을 등록하는 두가지 방법

  • 컴포넌트 스캔과 자동 의존 관계 설정
  • 자바 코드로 직접 스프링 빈 등록

컴포넌트 스캔과 자동 의존 관계 설정

@Service, @Controller, @Repository or @Component

패키지 포함 하위 클래스들은 자동으로 컴포넌트 스캔의 대상임

기본으로 싱글톤으로 등록한다.(유일하게 하나만 등록해서 공유함)

package hello.hellospring.controller;

import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class MemberController {

   private final MemberService memberService;

   @Autowired
   public MemberController(MemberService memberService) {
          this.memberService = memberService;
   }
}

회원 서비스 빈 등록

@Service
public class MemberService {
  private final MemberRepository memberRepository;

  @Autowired
  public MemberService(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
 }
}

자바 코드로 직접 스프링 빈 등록하기

장점 : 데이터 저장소가 선정되지 않아서, 인터페이스로 구현 클래스를 변경할 수 있도록 설계 할 경우에 레포지토리만 바꾸면 돼서 편하다.

SpringConfig

package hello.hellospring;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;

import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

  @Bean
  public MemberService memberService() {
    return new MemberService(memberRepository());
	 }

  @Bean
  public MemberRepository memberRepository() {
    return new MemoryMemberRepository();
  }
}

참고: DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에
동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

주의: @Autowired 를 통한 DI는 helloConroller , memberService 등과 같이 스프링이 관리하는객체에서만 동작한다.
스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.

profile
배우고 적용하고 개선하기

0개의 댓글

관련 채용 정보