스프링 컨테이너를 사용하기 위해 스프링 컨테이너가 사용하는 구성정보 (클래스) 를 제공해야합니다.
즉, 우리가 만든 코드를 어떻게 Object로 만들어서 스프링 컨테이너에 컴포넌트로 등록해 두고
스프링 컨테이너안에Bean(Object)이 또다른Bean(Object)를 의존(사용)한다면
관계를 어떻게 맺어줄 것인지, 어느 시점에 관계를 주입해 줄것인지 알아보겠습니다.
팩토리 메소드는 어떤
오브젝트를 생성하는 로직을 담당하는 메소드입니다.
Bean오브젝트를 펙토리 메소드에서 전부 진행하게 할것입니다.
Configuration를 붙여 스프링 컨테이너에게 구성정보를 갖고있다고 알려줘야합니다.@Bean 어노테이션을 통해 스프링 컨테이너에게 Bean이라는 정보를 알려줍니다.@Configuration // 구성 정보를 가지고 있는 클래스라는것을 알림
public class HellobootApplication {
// 스프링 컨테이너에게 필요한 의존 오브젝트를 파라미터로 받아옵니다.
@Bean
public HelloController helloController(HelloService helloService){
return new HelloController(helloService);
}
@Bean
public HelloService helloService(){
return new SimpleHelloService();
}
팩토리 메소드에서는 return type을 인터페이스로 하는게 좋습니다.
Bean을 주입받는 쪽에서 생성자로 어떤 타입을 받을지 결정하는게 좋습니다.
스프링 컨테이너는 클래스에Configuration가 붙어있고@Bean이 붙어있는 것을 찾아Bean으로 등록합니다.
가장 중요한 것은
Configuration이 붙은 클래스가AnnotationConfigWebApplicationContext에 처음으로 등록된다는 것입니다.
@Configuration // 구성 정보를 가지고 있는 클래스라는것을 알림
public class HellobootApplication {
// 스프링 컨테이너에게 필요한 의존 오브젝트를 파라미터로 받아옵니다.
@Bean
public HelloController helloController(HelloService helloService){
return new HelloController(helloService);
}
@Bean
public HelloService helloService(){
return new SimpleHelloService();
}
public static void main(String[] args) {
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(){
@Override
protected void onRefresh() {
super.onRefresh();
// 서블릿 펙토리 : 서블릿 컨테이너를 만드는 것을 쉽게 도와줍니다.
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
// serverFactory.getWebServer : 서블릿 컨테이너 생성하는 메소드입니다.
// 따라서 webServer 가 서블릿 컨테이너 입니다.
WebServer webServer = serverFactory.getWebServer(servletContext -> {
servletContext.addServlet("dispatcherServlet",
new DispatcherServlet(this) // DispatcherServlet이 작업을 위임할 applicationContext를 등록
).addMapping("/*"); // 모든 요청을 다 받는다.
});
webServer.start();
}
}; // 스프링 컨테이너 생성
applicationContext.register(HellobootApplication.class);
applicationContext.refresh(); // Bean을 만드는 명령어
}
}