스프링 빈과 의존 관계
2023. 5. 2. 05:04ㆍ카테고리 없음
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 // 스프링 컨테이너에서 memberService를 가져와 연결시켜주는 역할임.
public MemberController(MemberService memberService) { // 생성자 주입
this.memberService = memberService;
}
}
@Service // 스프링 컨테이너에 MemberService를 넣어주는 역할.
public class MemberService {
private final MemberRepository memberRepository;
@Autowired // 멤버 서비스와 레퍼지토리를 연결시켜줌.
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
@Repository // Repository를 스프링 컨테이너에 넣어주는 역할
public class MemoryMemberRepository implements MemberRepository {}
@Component // 사실 @Controller, @Service, @Repository 들은 다 @Component를 내장하고 있음. 그래서 원래는 @Component만 적어도 가능함.
// 이것이 바로 컴포넌트 스캔과 자동 의존관계 설정이다.
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() { //memberService를
return new MemberService(memberRepository());
}
// 위 아래 둘다 스프링 빈에 등록을 해주고 밑에서 등록했던 메모리를 위 서비스에 넣어준 다는 것이다.
@Bean
public MemberRepository memberRepository() { //
return new MemoryMemberRepository();
}
}
멤버서비스가 메모리레퍼지토리를 필요로 하기때문에 먼저 둘다 빈으로 등록을 해주고, 멤버서비스에 메모리를 넣어주도록 저렇게 설계를 해주면, 아까 위에있던 멤버 컨트롤러에서 정의한 멤버서비스에 위 값을 넣어준다. 고로 다음 사진과 같은 형태가 이루어 지게 되는 것이다.
DI : DependencyInjection DI에는 3가지 주입 방식이 있다. 필드 주입, setter 주입, 생성자 주입 이렇게 있다.
생성자 주입 : 밑에 코드와 같이 생성자를 만들어서 외부에서 주입해주는 경우. (가장많이 사용하는 주입이다.)
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository \= memberRepository;
}
필드 주입 : 필드에서 그냥 바로 적어서 만드는 것.(근데 별로 안좋음)
@Autowired private MemberService memberService;
Setter 주입 : setter로 만드는 주입이다.
private MemberService memberService;
@Autowired
publilc voidd setMemberService(MemberService memberService) {
this,memberService = memberService;
}