-스프링 컨테이너는 스프링에서 자바 객체들을 관리하는 공간을 말함
-자바 객체를 스프링에서 빈(Bean)이라고 하는데, 스프링 컨테이너에서는 이 빈의 생성부터 소멸까지를 개발자 대신 관리해주는 곳이라고 할 수 있음
-스프링 컨테이너는 크게 두 종류로 나눌 수 있다 하나는 BeanFactory이고, 다른 하나는 ApplicationContext 임
-ApplicationContext 컨테이너가 BeanFactory의 기능을 포괄하면서 추가적인 기능을 제공하기 때문에 대부분의 경우에는 ApplicationContext를 사용함
-스프링 컨테이너에 객체, 빈을 등록하는 이유는 스프링이 각 객체간 의존관계를 관리하도록 하는데에 큰 목적이 있음
-객체가 의존관계를 등록할 때는 스프링 컨테이너에서 해당하는 빈을 찾고, 그 빈과 의존성을 만듬
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@Service
public class MemberService {
private final MemberRepository memberRepository;
...
}
위 코드와 같이 MemberController 클래스에는 @Controller 어노테이션을, 그리고 생성자에 @Autowired를 적어두면, 이 인스턴스는 MemberService와 의존관계를 가진다는 의미를 줌
(단, @Autowired가 정상적으로 동작하려면 두 인스턴스가 빈으로써 스프링 컨테이너에 들어가 있어야 함)
-스프링은 보통의 경우 스프링 컨테이너에 빈 인스턴스를 단 한개만 저장하는 싱글톤 방식을 채택하고 있음
-빈 이름은 항상 다르게 지정이 되어야 함 예상치 못한 여러 오류가 발생하는데, 이를 개발 중 발견하기 매우 어렵기 때문
-스프링 빈을 등록하는 방법은 크게 2가지로 나뉨
-@Component 어노테이션을 이용해 사용
-이외에도 스프링 프레임워크에서 제공하는 @Controller나 @Service 혹은 @Repository와 같은 어노테이션은 아래와 같이 인터페이스로 @Component 어노테이션을 받기 때문에 컴포넌트 등록이 가능함
...
@Component
public @interface Service {
...
}
-단, 실행되는 패키지와 같은 패키지에 있는 클래스에 대해서만 @Component 어노테이션이 적용됨
-@Configuration과 @Bean 어노테이션을 사용해 등록
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
}