ServletFactory
(톰캣)와DispatcherServlet
도스프링 컨테이너
에 등록하여 사용해보겠습니다.
이렇게 하면 나중에 유연한 구성이 가능해 집니다.
팩토리 메소드
를 사용할 것입니다.
주석에도 설명했듯이
스프링 컨테이너가
이 알아서DispatcherServlet
이 이용해야할
컨트롤러를 찾기위한 ApplicationContext를 주입
해 줍니다
@Bean
public ServletWebServerFactory servletWebServerFactory(){
return new TomcatServletWebServerFactory();
}
@Bean
public DispatcherServlet dispatcherServlet(){
// DispatcherServlet이 이용할 컨트롤러를 찾아야 하기때문에 ApplicationContext를 생성자로 주어야합니다.
// 스프링이 알아서 ApplicationContext를 주입해 줍니다!!
return new DispatcherServlet();
}
@Configuration // 구성 정보를 가지고 있는 클래스라는것을 알림
@ComponentScan
public class HellobootApplication {
@Bean
public ServletWebServerFactory servletWebServerFactory(){
return new TomcatServletWebServerFactory();
}
@Bean
public DispatcherServlet dispatcherServlet(){
// DispatcherServlet이 이용할 컨트롤러를 찾아야 하기때문에 ApplicationContext를 생성자로 주어야합니다.
// 스프링이 알아서 ApplicationContext를 주입해 줍니다!!
return new DispatcherServlet();
}
public static void main(String[] args) {
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(){
@Override
protected void onRefresh() {
super.onRefresh();
// 서블릿 펙토리 : 서블릿 컨테이너를 만드는 것을 쉽게 도와줍니다.
ServletWebServerFactory serverFactory = this.getBean(ServletWebServerFactory.class);
DispatcherServlet dispatcherServlet = this.getBean(DispatcherServlet.class);
// serverFactory.getWebServer : 서블릿 컨테이너 생성하는 메소드입니다.
// 따라서 webServer 가 서블릿 컨테이너 입니다.
WebServer webServer = serverFactory.getWebServer(servletContext -> {
servletContext.addServlet("dispatcherServlet",dispatcherServlet
).addMapping("/*"); // 모든 요청을 다 받는다.
});
webServer.start();
}
}; // 스프링 컨테이너 생성
applicationContext.register(HellobootApplication.class);
applicationContext.refresh(); // Bean을 만드는 명령어
}
}
어떻게 스프링 컨테이너가 DispatcherServlet에게 ApplicationContext를 주입해 주었을까??
그것은 Bean의 생명주기 메소드
를 잘 알아야 합니다.
Bean의 생명주기 메소드
는 추후에 더 공부하는걸로 해보겠습니다...
스프링 너무 어렵다...😂