스프링빈을 등록하는 2가지 방법
컴포넌트 스캔과 자동 의존 관계 설정(에노테이션을 붙여서)
@Component
에노테이션이 있으면 스프링 빈으로 자동 등록합니다.
@Component
를 포함하는 다음 에노테이션 스프링 빈으로 자동 등록 됩니다.
@Controller
@Service
@Repository
// 생략
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// 생략
}
주의 참고로 아무 폴더에나 에노테이션을 붙인다고 스프링 빈으로 등록되는건 아니고, 기본적으론 메인메서드@SpringBootApplication
하위 혹은 동일 위치 에 있을 경우만 된다.
package hello.hellospring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloSpringApplication {
public static void main(String[] args) {
SpringApplication.run(HelloSpringApplication.class, args);
}
}
참고
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본으로 싱글톤으로 등록
싱글톤 패턴
애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴.
자바 코드로 직접 스프링 빈 등록하기
SpringConfig
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
과거에는 XML 방식으로도 썼지만, 현재는 거의 사용하지 않음
DI의 세가지 방법
생성자 주입 (추천)
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
필드 주입 (비추천 → 중간에 변경할 수 있는 방법이 없음)
@Autowired private MemberService memberService;
setter 주입 (누군가가 멤버 서비스를 중간에 바꿀 수 있게 되고, 노출 되어버림)
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}