
Electron以慢著称,为什么桌面QQ却选择它做架构升级?
文章链接:https://cloud.tencent.com/developer/article/2332111
最近在使用 electron 做本地资源管理器的时候,可以考虑初始化加载页、多窗口的创建销毁、多窗口通信等方面进行优化。上文就给出了一些的优化思路。
Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
Spring Boot由Pivotal团队开发,最早于2014年发布。其目标是简化Spring应用的开发和部署,通过自动配置和起步依赖等特性,减少开发人员在配置文件上花费的时间和精力。
Spring Boot的核心特点可以概括为以下几点:
Spring Boot适用于多种业务场景,包括但不限于:
Spring Boot的功能点非常丰富,包括但不限于:
Spring Boot可以通过以下两种方式整合Tomcat:
在Spring Boot中,可以通过在配置文件中配置端口号、上下文路径、Session超时时间等来定制内嵌Tomcat服务器的配置。例如,在application.properties或application.yml文件中进行如下配置:
properties复制代码
server.port=8080
server.servlet.context-path=/myapp
server.servlet.session.timeout=30m在Spring Boot的源码中,这些配置会被读取并应用到Tomcat服务器实例上。具体来说,TomcatEmbeddedServletContainerFactory类负责创建和配置Tomcat服务器实例。
在Spring Boot中,可以使用@ServletComponentScan注解来加载Servlet、Filter和Listener。在应用启动时,Spring Boot会自动扫描@ServletComponentScan注解指定的包,查找并注册Servlet、Filter和Listener。
例如,定义一个Servlet:
java复制代码
@WebServlet(urlPatterns = "/myservlet")
public class MyServlet extends HttpServlet {
// Servlet实现
}在Spring Boot的源码中,ServletRegistrationBean、FilterRegistrationBean和ServletContextInitializer等类负责将Servlet、Filter和Listener注册到Tomcat中。
Spring Boot提供了一个名为EmbeddedServletContainerAutoConfiguration的自动配置类,它根据应用中所包含的类库和配置信息来自动配置内嵌的Servlet容器。具体来说,该类会检查类路径中是否存在Tomcat、Jetty或Undertow等服务器的依赖,并根据存在的依赖自动配置相应的Servlet容器。
在自动配置过程中,Spring Boot会扫描应用中所有的Servlet、Filter和Listener,然后根据这些组件的注解信息生成对应的ServletRegistrationBean、FilterRegistrationBean和ServletContextInitializer对象,最终将这些组件注册到Tomcat中。
在Spring Boot中,可以使用SpringApplication类来启动Tomcat。在SpringApplication的run方法中,会创建并启动Tomcat服务器实例。
具体来说,SpringApplication会执行以下步骤来启动Tomcat:
SpringApplication会创建一个AnnotationConfigServletWebServerApplicationContext实例,作为Spring应用上下文。SpringApplication会加载EmbeddedServletContainerAutoConfiguration等自动配置类,并根据这些配置类来配置Spring应用。SpringApplication会扫描应用中的Servlet、Filter和Listener,并将它们注册到Tomcat中。SpringApplication会将配置好的Tomcat服务器实例启动起来,并开始处理HTTP请求。下面我们通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
首先,我们创建一个标准的Spring Boot项目结构,包括src/main/java、src/main/resources等目录。
在src/main/java目录下,定义一个启动类,并使用@SpringBootApplication注解标记:
java复制代码
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}在src/main/resources目录下的application.properties文件中,配置Tomcat的相关属性:
properties复制代码
server.port=8080
server.servlet.context-path=/myapp
server.servlet.session.timeout=30m在src/main/java目录下,定义一个Servlet类:
java复制代码
package com.example.demo.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Hello, Spring Boot with Tomcat!");
}
}接下来,我们手写模拟Spring Boot的启动过程。首先,我们需要创建一个自定义的SpringApplication类,并在其中实现Tomcat的启动逻辑。
SpringApplication类在src/main/java目录下,创建一个自定义的SpringApplication类:
java复制代码
package com.example.demo;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.example.demo")
public class CustomSpringApplication {
public static void main(String[] args) throws LifecycleException {
// 创建Tomcat实例
Tomcat tomcat = new Tomcat();
tomcat.setPort(8080); // 设置端口号
tomcat.setContextPath("/myapp"); // 设置上下文路径
tomcat.setSessionTimeout(30); // 设置Session超时时间
// 添加Web应用
tomcat.addWebapp("/", System.getProperty("user.dir") + "/src/main/webapp");
// 启动Tomcat服务器
tomcat.start();
tomcat.getServer().await();
}
}在src/main/webapp目录下,创建一个WEB-INF目录,并在其中创建一个web.xml文件(虽然Spring Boot通常不需要web.xml,但为了模拟传统Web应用的部署方式,我们在这里创建一个)。
web.xml文件内容如下:
xml复制代码
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.example.demo.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>现在,我们可以运行CustomSpringApplication类的main方法来启动模拟的Spring Boot应用。启动后,访问http://localhost:8080/myapp/hello,应该能够看到“Hello, Spring Boot with Tomcat!”的响应。
本文通过深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,特别是其与Tomcat的整合方式,展示了Spring Boot的强大功能和灵活性。同时,通过手写模拟Spring Boot的启动过程,进一步加深了对Spring Boot内部工作机制的理解。希望本文能为读者在使用Spring Boot进行开发时提供有益的参考和帮助。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。