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

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

 

 

 

첫번째 방법

컴포넌트 스캔 방식이란?

@Controller  / @Service / @Repository  로 자동으로 스프링 빈에 등록

 

@Service가 사실 까보면(?) @Component 가 포함이다. @Contoller, @Repository 도 마찬가지.

@Component 어노테이션이 있으면 스프링 빈으로 자동등록이 되니

@Component 포함된 @Controller  / @Service / @Repository  세개의 어노테이션도 스프링 빈으로 자동 등록이 된다.

 

@Controller  - @Service - @Repository 을 선을 이어 연관되도록 관계짓는것이 @Autowired 

 

 

@Autowired 

연관관계 

helloController 가 memberService를 쓸 수 있게 하고

memberService가 memberRepository를 쓸 수 있게하는 관계

스프링 빈 등록 이미지

 

@Controller 어노테이션은 멤버컨트롤러 객체를 생성하여 스프링에 넣어두고 스프링이 관리한다.
[참고]
스프링은 스프링 컨테이너에 스프링 빈을 등록할때 기본으로 싱글톤(하나만 등록하여 공유)으로 등록한다
즉 같은 스프링 빈이면 모두 같은 인스턴스다.

 

 

 

 

두번째 방법 (중요)

 

일단,

스프링 컨테이너에서 연결되는 관계 어노테이션을 Controller 빼고 모조리 지우고 직접 스프링 빈 등록해보자

 

memberService 에서  @Service/@Autowired  지우고

memberRepository에서 @Repository 지우면 연결이 안된상태(오류)가 됨! 

 

 

 

[ SpringConfig] 파일을 따로만들고 @Configuration 어노테이션 쓰기

@Bean 어노테이션을 써서 스프링 빈에 memberService, memberRepository 을 각각 등록해준다.

 

memberService - memberRepository  을 연결시키려면 @Autowired 과 비슷한데

memberService( memberRepository () ) 안에 넣어줌.

 

 

 

 

 

Controller는 컴포넌트 스캔이라서 @Autowired로 직접 스프링 빈으로 등록한 memberService 와 연결

= 생성자 주입

 

즉 생성자를 통해서 memberService 가 memberController에 주입이된다.

 

 

= 연결 상태가 됨

스프링 빈 등록 이미지

 

 

 

 

 

필드 주입

생성자를 빼고 필드에 Autowired 한 방법 

중간에 바꿀 방법이 없어서 별로.

 

 

 

DI는  Dependency Injection  = 의존관계 주입

  1. 생성자 주입 (권장)
  2. 필드 주입
  3. setter 주입 (아직 잘모르겠음..)

 

 

 

스프링 빈을 직접 등록해야하는 경우

정형화되지 않거나 상황에 따라 구현 클래스를 변경해야하면 설정을 통해 스프링 빈으로 등록한다.

 

구현 클래스를 변경? 

데이터 저장소가 선정되지 않을때 memoryMemberRepository를 만들어 리파지토리 저장했는데

다른 리파지토리로 바꿀때 기존의 코드를 손 안대고 바꿀수있는 법은 DbMemberRepository 만 바꿔주면 됨.

 

 

 

 

 

반응형
LIST

+ Recent posts