1 Spring boot性能优化
1.1 扫包优化
@SpringBootApplication注解自动获取应用的配置信息,会给应用带来一些副作用。由自动配置( auto-configuration )和 组件扫描 ( component scanning )组成,这跟使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的作用是一样的。这样做给开发带来方便的同时,也会有三方面的影响:
1、会导致项目启动时间变长。当启动一个大的应用程序,或将做大量的集成测试启动应用程序时,影响会特别明显。
2、会加载一些不需要的多余的实例(beans)。
3、会增加 CPU 消耗。
针对以上三个情况,我们可以移除 @SpringBootApplication 然后使用 @ComponentScan注解来扫描特定的包
移除 @SpringBootApplication and @ComponentScan, 用 @EnableAutoConfiguration 来替代 //@SpringBootApplication @Configuration @EnableAutoConfiguration @ComponentScan(basePackages = {"com.itboy.adminuiclient"}) public class App01 {
public static void main(String[] args) { SpringApplication.run(App01.class, args); }
}
|
1.2 JVM参数调优
具体的详细介绍请看我的另一片jvm参数调优。下面直接实战
内部使用:
根据服务器的内存大小,来设置堆参数。
-Xms :设置Java堆栈的初始化大小
-Xmx :设置最大的java堆大小
实例参数-XX:+PrintGCDetails -Xmx32M -Xms1M
本地项目调优
外部:java -server -Xms32m -Xmx32m -jar spboot-0.0.1-SNAPSHOT.war
通过jconsole工具可以查看详细信息。
1.3 替换Tomcat服务器为undertow
默认情况下,Spring Boot 使用 Tomcat 来作为内嵌的 Servlet 容器
可以将 Web 服务器切换到 Undertow 来提高应用性能。Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。首先,从依赖信息里移除 Tomcat 配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
然后添加 Undertow:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
参考这一届https://blog.csdn.net/qq_37049496/article/details/81446140压力测试进行吞度量测试。
2 手写一个spring boot框架
2.1 SpringBoot核心原理
基于SpringMVC无配置文件、(纯Java)完全注解化+内置tomcat实现SpringBoot框架、Main函数启动。
SpringBoot核心快速整合第三方框架原理:Maven继承依赖关系
SpringBoot内嵌入tomcat
SpringBoot采用SpringMVC注解版本实现无配置效果(spring3.0之后SpringMVC就可以通过注解然后自动配置咯)
2.2 内置Tomcat容器(直接利用Java语言创建Tomcat服务器运行)
添加依赖:
<dependencies>
<!--java操作tomcat-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.31</version>
</dependency>
<!--tomcat对jsp支持-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>8.5.31</version>
</dependency>
</dependencies>
创建servlet:
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("it is my first index Page");
}
}
创建tomcat启动程序:
public class Test1 {
//端口号
private static int PORT=8080;
//上下文路径(项目路径)
private static String CONTEXT_PATH="/itboy";
public static void main(String[] args) throws LifecycleException {
//创建tomcat服务器
Tomcat tomcat=new Tomcat();
//设置tomcat端口号
tomcat.setPort(PORT);
tomcat.getHost().setAutoDeploy(false);
//创建上下文
StandardContext standardContext=new StandardContext();
standardContext.setPath(CONTEXT_PATH);
standardContext.addLifecycleListener(new Tomcat.FixContextListener());
//将上下文添加到tomcat容器
tomcat.getHost().addChild(standardContext);
/**
* 其实下面两件事不就是web.xml中配置的吗?就是利用这种方式加到tomcat容器中的,SpringMV也是类似,做的事也就下面两件事
*/
//创建servlet
tomcat.addServlet(CONTEXT_PATH,"IndexServlet",new IndexServlet());
//添加servlet映射
standardContext.addServletMappingDecoded("/index","IndexServlet");
tomcat.start();
System.out.println("启动tomcat服务器。。。。");
tomcat.getServer().await();
}
}
启动程序后访问http://localhost:8080/itboy/index看是否成功。
2.3 springMVC无配置启动
SpringMVC原理
- 用户发送请求至前端控制器DispatcherServlet
⑵ DispatcherServlet收到请求调用HandlerMapping处理器映射器。
⑶ 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
⑷ DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
⑸ 执行处理器(Controller,也叫后端控制器)。
⑹ Controller执行完成返回ModelAndView
⑺ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
⑻ DispatcherServlet将ModelAndView传给ViewReslover视图解析器
⑼ ViewReslover解析后返回具体View
⑽ DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
⑾ DispatcherServlet响应用户。
DispatcherServlet是Spring MVC的核心,每当应用接受一个HTTP请求,由DispatcherServlet负责将请求分发给应用的其他组件。
在旧版本中,DispatcherServlet之类的servlet一般在web.xml文件中配置,该文件一般会打包进最后的war包种;但是Spring 3引入了注解,在2.2的基础上,下面展示基于注解配置Spring MVC
添加依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
2.3.1 加载SpringMVCDispatcherServlet
AbstractAnnotationConfigDispatcherServletInitializer这个类负责配置DispatcherServlet、初始化Spring MVC容器和Spring容器。getRootConfigClasses()方法用于获取Spring应用容器的配置文件,这里我们给定预先定义的RootConfig.class;getServletConfigClasses负责获取Spring MVC应用容器,这里传入预先定义好的WebConfig.class;getServletMappings()方法负责指定需要由DispatcherServlet映射的路径,这里给定的是"/",意思是由DispatcherServlet处理所有向该应用发起的请求。
RootConfig.java,Spring应用容器的配置
@Configuration
@ComponentScan(basePackages = "com.itboy")
public class RootConfig {
}
WebConfig.java,Spring MVC的配置
@Configuration
@EnableWebMvc
@ComponentScan("com.itboy.controller")
public class WebConfig extends WebMvcConfigurerAdapter {
}
启动类:
public class App {
public static void main(String[] args) throws ServletException, LifecycleException, IOException {
start();
}
private static void start() throws ServletException, LifecycleException, IOException {
Tomcat tomcat=new Tomcat();
tomcat.setPort(8080);
StandardContext standardContext= (StandardContext) tomcat.addWebapp("/",new File("selfspboot/src/main").getAbsolutePath());
//禁止重新载入
standardContext.setReloadable(false);
File additionWebInfClasses=new File("target/classes");
//创建webroot
WebResourceRoot resourceRoot=new StandardRoot(standardContext);
resourceRoot.addPreResources(
new DirResourceSet(resourceRoot,"/WEB-INF/classes",additionWebInfClasses.getAbsolutePath(),"/")
);
tomcat.start();
System.out.println("服务启动。。。");
tomcat.getServer().await();
}
}
controller:
@RestController
public class IndexController {
@RequestMapping(value = "/index",produces = "text/html;charset=utf-8")
public String index(){
return "开始了,这就搞定啦???????";
}
}
启动后访问http://localhost:8080/index看看神器的效果发生了?
2.4 添加jsp支持,不就是整合jsp?
在2.3的WebConfig.java中添加以下内容
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
//可通过${}访问beans
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}
设置好相应的配置好相应的controller以及jsp文件,比如访问http://localhost:8080/index2是否成功。