SpringBoot启动及自动装配原理过程详解
SpringBoot启动及自动装配原理过程详解 SpringBoot启动及自动装配原理过程详解是 SpringBoot 框架中一个非常重要的机制,它控制着整个应用程序的启动和自动装配过程。下面将详细介绍 SpringBoot 启动及自动装配原理过程。 一、Servlet2(老Spring-MVC)配置文件 在老的 Spring-MVC 框架中,主要配置文件包括 web.xml、application-context.xml 和 springMVC.xml。 * Web.xml:主要配置项目启动项 * Application-context.xml:主要配置项目包扫描、各种 bean、事务管理 * SpringMVC.xml:主要配置 controller 包扫描、视图解析器、参数解析器 二、启动过程 每一个 Spring 项目启动时都需要初始化 Spring-context,对于非 Web 项目可以在程序 main 方法中触发这个 context 的初始化过程。但是对于 Web 项目,开发者不能直接触发 Spring-context 的初始化,就需要将初始化过程与容器的启动过程做强关联。 在 Web.xml 中配置的 ContextLoadListener 就是这个关联点,它监听到容器启动了就会去初始化 Spring-context。DispatcherServlet 是全局核心控制器,所有的请求都需要被它拦截,所以他的启动时机需要配置,默认是第一个请求到来时才实例化它。但是可以将它配置为随容器启动而初始化,在 DispatcherServlet 初始化过程中去读取 springMVC.xml 配置文件,完成 controller 映射、视图解析、参数解析等工作。 三、Servlet3 Servlet3 规定,如果在当前项目的 classPath 下,存在 META-INF/services/javax.servlet.ServletContainerInitializer 配置文件,且文件中写了 ServletContainerInitializer 的实现类的全类名,容器启动时实现类的 onStartup 方法就会被调用。在 Spring 中配置的 ServletContainerInitializer 接口实现类是 org.springframework.web.SpringServletContainerInitializer。 SpringServletContainerInitializer 上有一个 @HandlesTypes(WebApplicationInitializer.class) 注解,此注解会将括号中的 WebApplicationInitializer 接口在项目中的所有实现类组装为 set,在 SpringServletContainerInitializer 的 onStartup 方法中进行遍历实例化并一一调用实例的 onStartup 方法,SpringBoot 提供的 WebApplicationInitializer 接口实现类是 SpringBootServletInitializer,此时项目的 Spring-context 的初始化操作就可以放到这个方法中来,这样就取代了 web.xml。 四、Spring Boot 启动 Spring Boot 启动类的 main 函数中,会实例化一个 Tomcat 对象,然后调用了 Tomcat 对象的一连串方法: Tomcat tomcat = new Tomcat(); tomcat.addWebApp("/", "D:/app/"); // 调用此方法是将项目当做 web 项目放入容器,同时也会触发 ServletContainerInitializer 的 onStartup 方法 tomcat.setPort(8080); tomcat.start(); tomcat.getServer().await(); // 启动线程,阻塞等待方法 五、自动装配原理 自动装配是 SpringBoot 框架中的一种机制,它可以自动地将 bean 注册到 Spring 容器中。@Configuration 注解可以将 bean 注册到容器中,而不需要手动地在 spring-application-context.xml 中配置。 Spring Boot 提供的 @SpringBootApplication 注解集成了 @ComponentScan,它默认会扫描启动类当前包及子包下所有类,这样就取代了 springMVC.xml 的功能。 SpringBoot 启动及自动装配原理过程详解是 SpringBoot 框架中一个非常重要的机制,它控制着整个应用程序的启动和自动装配过程。