2023. 2. 3. 01:38ㆍSpring 강의/section4
자바 코드로 직접 스프링 빈 등록하기
- 직접 설정파일에 등록하기
먼저 MemberService와 MemoryMemberRepository에 있던 @Service, @Repository, @Autowired 어노테이션을 지워준다.
그리고 SpringConfig 클래스 추가
SpringConfig.class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package hello.hellospring2;
import hello.hellospring2.repository.MemberRepository;
import hello.hellospring2.repository.MemoryMemberRepository;
import hello.hellospring2.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();
}
}
|
cs |
1. 스프링이 뜰 때 @Configuration 읽음.
2. @Bean을 보고 인식해서 memberService()와 memberRepository()를 스프링 빈에 등록
3. 스프링 빈으로 등록되어 있는 memberRepository를 MemberService에 넣어준다.
MemberController.class
컨트롤러 코드는 어쩔 수 없음. 그냥 둔다.
실행시켜보면 잘 돌아간다.
현재 이 그림까지 완성
DI의 3가지 방법
1. 생성자 주입
생성자를 통해 memberService가 MemberController에 주입된다.
2. 필드 주입
이렇게 필드 주입으로 등록되면 수정이 어려워서 별로 권장 안 한다.
3. Setter 주입
누군가가 MemberController를 호출했을 때 setMemberService가 public으로 되어 있어야한다.
한 번 세팅하면 거의 바꿀 일이 없는데 누군가 바꿔치기하기 쉽게 public으로 열려 있고
아무나 호출할 수 있다는 단점이 있다.
그래서 요즘 권장하는 스타일은 생성자 주입이라는 것!
참고 : 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.
그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.