盐城企业做网站多少钱,潍坊建设企业网站,创意设计产业包括哪些,游戏网站怎么赚钱需求缘起#xff1a;有人在【springboot】微信公众号问#xff1a;springboot启动慢的问题何时有个分享就好了#xff0c;谢谢。粉丝的问题还是要认真的回答的。 我们先看看本节的大纲#xff1a; #xff08;1#xff09;组件自动扫描带来的问题#xff08;SpringBootA…需求缘起有人在【springboot】微信公众号问springboot启动慢的问题何时有个分享就好了谢谢。粉丝的问题还是要认真的回答的。 我们先看看本节的大纲 1组件自动扫描带来的问题SpringBootApplication2如何避免组件自动扫描带来的问题不使用 SpringBootApplication3引发的问题——无法扫描组件4千古红楼只一梦竹篮打水一场空5debug debugbug bug更健康6分析Positive matches和Negative matches7再次优化配置信息8总结 接下来我们一起探讨下每个问题。 1组件自动扫描带来的问题SpringBootApplication 我们在第一篇博客就介绍了我们默认情况下我们会使用SpringBootApplication注解来自动获取应用的配置信息但这样也会带来一些副作用。使用这个注解后会触发自动配置auto-configuration和组件扫描component scanning这跟使用Configuration、EnableAutoConfiguration和ComponentScan三个注解的作用是一样的。这样做给开发带来方便的同时会有以下的一些影响 a会导致项目启动时间变长原因加载了我们不需要使用的组件,浪费了cpu资源和内存资源。当启动一个大的应用程序或将做大量的集成测试启动应用程序时影响会特别明显。 b会加载一些不需要的多余的实例beans。 c会增加CPU消耗和内存的占用。 2如何避免组件自动扫描带来的问题(不使用 SpringBootApplication) 本着有问题就要解决的心态针对以上的问题我们要怎么解决呢很明显既然SpringBootApplication加载了一些不必要的配置那么我们想是否可以就加载我们自己指定的配置呢我们的思路不使用SpringBootApplication并且不使用ComponentScan注解此注解会自动扫描我们注解了ControllerService的注解的类加载到Spring IOC容器中然后我们使用Configuration和EnableAutoConfiguration进行配置启动类代码如下 package com.kfit.spring_boot_performance; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.kfit.spring_boot_performance.controller.HelloController; /** * author Angel --守护天使 * version v.0.1 * date 2017年3月11日 */ //移除 SpringBootApplication and ComponentScan, 用 EnableAutoConfiguration 来替代 Configuration EnableAutoConfiguration public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } 3引发的问题——无法扫描组件 我们正要为我们的代码改良庆幸的时候我们发现问题来了。启动之后访问我们编写的访问页面/index出现错误There was an unexpected error (typeNot Found, status404). 这是由于什么引起的呢还记得我们刚刚介绍的ComponentScan注解嘛启用这个注解Spring才能够进行自动组件的扫描否则无法扫描到我们编写的组件类。那么问题来了怎么办呢问题的解决就是显式进行配置。 注入代码如下假设我们写的类是HelloController在这里博主直接写在App.java启动类进行注入 Bean public HelloController helloController(){ return new HelloController(); } 在以上的代码中用 Bean 注解明确显式配置以便被 Spring 扫描到。 在重新启动之后我们就可以正常访问/index页面了。 到这里肯定就会有人会说那这样的话不是会增加我们的编码量。我只能说你既要加载快又要不编码博主实在不知道怎么办了。凡事有利有弊自己权衡利弊。 4千古红楼只一梦竹篮打水一场空 有人不相信这个真的能启动更快吗于是乎就编码进行测试。哈哈露馅了还是一样启动的跟蜗牛一样慢。那为什么是这样呢为什么我们研究了半天最终却是千古红楼只一梦竹篮打水一场空。 聪明的读者会注意到我们提到SpringBootApplication注解的作用跟EnableAutoConfiguration注解的作用是相当的那就意味着它也能带来上述的问题。要避免这些问题我们就要知道我们的组件列表是哪些 5debug debugbug bug更健康 我们在上面说了我们的问题就是如何知道我们的组件列表是哪些这时候debug就隆重登场了鼓掌欢迎debug先生上场。 请问debug先生在此时此刻您有什么获奖感言 debug先生经历了慢慢人生我终于发现我的价值了。在这里我要感谢CCTV、感谢MTV、感谢可口可乐感谢非常可乐、感谢加多宝、感谢王老吉、感谢主办方SpringBoot让我有机会在这个舞台跟大家见面。谢谢你们我一定不会让大家失望的。 好了废话不多说了我们先看看如何使用debug呢 第一种情况使用spring-boot:run启动方式 这种情况的话完整的运行代码是 spring-boot:run -Ddebug 第二种情况使用Run As —— Java Application启动方式 这种情况的话配置VM参数即可具体操作如下 【右键】——【Run As】——【Run Configurations…】——【选择Arguments】——【VM arguments】中加入【-Ddebug】。 这时候在启动的时候我们就能看到控制台打印出了一些我们平时没看到过的日志信息。 AUTO-CONFIGURATION REPORTPositive matches:-----------------DispatcherServletAutoConfiguration matched- ConditionalOnClass found required class org.springframework.web.servlet.DispatcherServlet (OnClassCondition)- ConditionalOnWebApplication (required) found StandardServletEnvironment (OnWebApplicationCondition)//此处省略剩下的打印信息… 6 分析Positive matches和Negative matches 在打印信息里我们有必要先了解下这里的一些知识 a Positive match累出匹配到对应类的配置项。b Negative match不包括某个配置项的原因。 现在以DataSourceAutoConfiguration举例说明 aConditionalOnClass表示对应的类在classpath目录下存在时才会去解析对应的配置文件对于DataSourceAutoConfiguration来说就是指只有javax.sql.DataSource和org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType类都存在时就会配置对应的数据库资源。bConditionalOnMissingClass表示对应的类在classpath目录下找不到。cOnClassCondition用于表示匹配的类型postive or negative。OnClassCondition是最普遍的浏览探测条件除此之外Spring Boot也使用别的探测条件如OnBeanCondition用于检测指定bean实例存在与否、OnPropertyCondition用于检查指定属性是否存在等等。符合negative match代表一些配置类xxxConfiguration之类的它们虽然存在于classpath目录但是修饰它们的注解中依赖的其他类不存在。 7 再次优化配置信息 根据上面的理论知识我们只需要在启动的时候显式地引入这些组件拷贝Positive matches中列出的信息 DispatcherServletAutoConfiguration EmbeddedServletContainerAutoConfiguration ErrorMvcAutoConfiguration HttpEncodingAutoConfiguration HttpMessageConvertersAutoConfiguration JacksonAutoConfiguration JmxAutoConfiguration MultipartAutoConfiguration ServerPropertiesAutoConfiguration PropertyPlaceholderAutoConfiguration ThymeleafAutoConfiguration WebMvcAutoConfiguration WebSocketAutoConfiguration 然后来更新项目配置显式地引入这些组件引入之后再运行一下应用确保没有错误发生Configuration Import({ DispatcherServletAutoConfiguration.class, EmbeddedServletContainerAutoConfiguration.class, ErrorMvcAutoConfiguration.class, HttpEncodingAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class, JacksonAutoConfiguration.class, JmxAutoConfiguration.class, MultipartAutoConfiguration.class, ServerPropertiesAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class, ThymeleafAutoConfiguration.class, WebMvcAutoConfiguration.class, WebSocketAutoConfiguration.class, }) public class App { 在上面的代码中我们可以删掉我们不需要的组件信息来挺高应用的性能比如在项目中没有使用Jmx和WebSocket功能的话那么我们就可以删除JmxAutoConfiguration.class和WebSocketAutoConfiguration.class。 删除掉之后再次运行项目确保一切正常。 8总结 在本篇文章中我们介绍了如何加速spring boot快速启动主要的思路就是废弃SpringBootApplication显式的引入我们所需要的组件。 下节预告介绍高性能Web服务器Undertow在下一篇介绍如何替换Tomcat使用Undertow进行内存优化。转载于:https://www.cnblogs.com/cmfwm/p/7943756.html