Spring Boot是基于Spring框架的一种快速开发框架,它通过自动化配置和约定大于配置的方式,可以快速的搭建一个Web应用。
Spring Boot启动流程主要分为三个阶段:准备阶段、上下文创建阶段、启动阶段。
准备阶段
Spring Boot准备阶段主要是读取应用程序的配置文件,获取配置文件中自定义的配置内容,并为后续的启动做好一些准备工作。准备阶段分为以下两个过程:
1. 加载基本的Spring Framework设置
在这一步中,Spring Boot会加载基本的Spring Framework设置,并创建并设置AnnotationConfigApplicationContext或者XmlWebApplicationContext的实例对象。
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
在Spring Boot应用程序中,我们可以通过调用“SpringApplication.run()”方法来启动应用程序,并返回一个上下文对象,该上下文对象为获取Spring Bean的方式提供了支持。
2. 加载配置文件
Spring Boot默认会使用application.properties或者application.yml作为应用程序的配置文件。在启动时Spring Boot会加载这些配置文件,根据不同的配置文件的前缀来创建一个Environment实例对象,并将其设置到Spring的上下文环境中。
server:
port: 8080
logging:
level:
com:
example:
acme: DEBUG
上下文创建阶段
在准备阶段完成后,Spring Boot将进入上下文创建阶段。在这个阶段中,Spring Boot会根据不同的配置来创建和管理Spring上下文。该阶段可以分为以下三个过程:
1. 创建BeanFactory
在创建BeanFactory时,Spring Boot将会实例化一个默认的BeanFactory。并在该BeanFactory中注册一些常用的Bean,比如包扫描机制等。
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.web(WebApplicationType.SERVLET)
.run(args);
}
通过调用SpringApplicationBuilder的run方法创建ApplicationContext实例时,如果我们指定WebApplicationType为SERVLET,那么就会创建一个org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext(ServletContext)对象。如果我们指定WebApplicationType为REACTIVE,那么就会创建一个org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext(ApplicationContext)对象。
2. 加载ApplicationContextInitializers并对ApplicationContext进行初始化
ApplicationContextInitializer是Spring提供的一个扩展点,它可以在ApplicationContext创建之前或之后对ApplicationContext进行一些预处理。Spring Boot中,主要为了满足用户的自定义扩展需求,Spring Boot提供了一些默认的ApplicationContextInitializer实现类,比如设置系统属性、设置环境变量等。
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.web(WebApplicationType.SERVLET)
.initializers(new MyApplicationContextInitializer())
.run(args);
}
public class MyApplicationContextInitializer implements ApplicationContextInitializer<GenericApplicationContext> {
@Override
public void initialize(GenericApplicationContext applicationContext) {
//自定义初始化逻辑
}
}
3. 装载应用程序主类
在装载应用程序主类时,Spring Boot会读取应用程序主类中的注解信息,例如:@Configuration、@ComponentScan等,在根据这些注解信息依次依赖注入应用程序中定义的各个Bean,完成程序的部署和配置。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在这个例子中,通过 @SpringBootApplication注解表示整个项目是一个SpringBoot应用程序,它会自动扫描包下所有@Component或@Configuration注解的类,并把这些类注入应用程序上下文。
启动阶段
在创建ApplicationContext之后,Spring Boot将会进入启动鉴定阶段。主要任务是启动服役服务或者Web容器。
1. 创建Web服务器
如果项目有WebApplicationType.SERVLET或WebApplicationType.REACTIVE的标记,那么就会启动该Web类型对应的Web服务器。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.web(WebApplicationType.SERVLET)
.run(args);
}
}
2. 启动服务器
启动服务器。
示例1
以下是一个使用Spring Boot启动HTTP服务器的示例代码。
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/{user}")
public String hello(@PathVariable("user") String user) {
return "hello, " + user;
}
}
示例2
以下是一个使用Spring Boot启动FTP服务器的示例代码。
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
@Configuration
@EnableFtpServer
public class FtpServerConfig {
@Autowired
private FtpServerProperties ftpServerProperties;
@Bean
public FtpServerFactory getFtpServerFactory() {
FtpServerFactory serverFactory = new FtpServerFactory();
ListenerFactory listenerFactory = new ListenerFactory();
listenerFactory.setPort(ftpServerProperties.getPort());
listenerFactory.setServerAddress(ftpServerProperties.getIpAddress());
serverFactory.addListener("default", listenerFactory.createListener());
return serverFactory;
}
}
以上就是Spring Boot超详细分析启动流程的完整攻略。涵盖了准备阶段、上下文创建阶段和启动阶段的详细解析,并给出了两个具体的示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot超详细分析启动流程 - Python技术站