스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트
스프링 컨테이너는 자바 객체의 생명주기를 관리(객체를 생성/관리/제거)하며, 생성된 자바 객체들에게 추가적인 기능을 제공함
*스프링에서는 자바 객체를 빈(Bean)이라고 함
즉, 개발자가 정의한 빈을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공함
스프링 부트를 사용하기 이전에는 XML을 통해 스프링 컨테이너를 직접 설정해주어야 했지만, 스프링부트가 등장하면서 어노테이션 기반으로 간편하게 설정할 수 있게 됨
스프링 컨테이너는 Beanfactory
와 ApplicationContext
두 종류의 인터페이스로 구현되어 있음
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
@Configuration
이 붙은 클래스를 설정 정보로 사용함 @Bean
이 적힌 메서드를 모두 호출하여 얻은 객체를 스프링 컨테이너에 등록하게 됨
public class MemberApp {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class)
}
}
ApplicationContext
를 스프링 컨테이너라고 하며, 인터페이스로 구현되어 있음 AnnotationConfigApplicationContext
는 ApplicationContext의 구현체 중 하나applicationContext.getBean(”이름”, 타입)
메서드를 이용하여 얻을 수 있음 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
<beans>
태그를 통해 필요한 값들을 설정할 수 있음 <bean id=”…”>
태그는 빈 정의를 식별하는 데 사용하는 문자열<bean class=”…”>
태그는 Bean의 유형을 정의하고 클래스 이름을 사용한
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
여기서 궁금했던 점은
🤔 내가 예전에 개발했던 프로젝트에서는 스프링 컨테이너를 생성한 적이 없는데 어떻게 된거지?
ApplicationContext를 굳이 만들지 않아도 main 메서드 내 SpringApplication.run() 메서드 내부에서 컨테이너를 생성한다
@RestController
@SpringBootApplication
public class KarrotApplication {
public static void main(String[] args) {
SpringApplication.run(KarrotApplication.class, args);
}
}
ApplicationContext를 직접 만들어 사용하는 이유는 수동 빈 등록을 위해서라고 한다
https://ittrue.tistory.com/220
https://www.inflearn.com/questions/882771/스프링-컨테이너-관련-질문-드립니다
https://www.inflearn.com/questions/320968/스프링-내부의-컨테이너