spring-boot系列(1) 初识spring-boot

本文分享了作者在学习Spring Boot过程中的心得与体会,并详细记录了在集成热部署(spring-boot-devtools)过程中遇到的问题及解决方案。对于如何配置热部署以提高开发效率进行了探讨。

最近工作比较清闲,就想好好学学spring-boot,由于初学,写的几个demo也比较lower,就不拿出来现了。主要扯扯蛋,先记录下现阶段在对spring-boot的一个认知吧。因为是认知,不代表一定正确,如有错误,希望路过的大婶能给指点下,不胜感激。

首先,我觉得spring-boot是个高级应用,不是什么新技术。是对spring生态的一个整合,spring-boot相对与spring基础犹如javaEE相对与java基础,spring-boot相对与spring插件(如spring-mvc等)犹如 javaEE相对与javaEE规范组成部分(如jsp)。当然我这只是打个比方,只是想说明,他们都是由技术细节堆积而成的应用框架。理解要站在高处看(spring-boot),想学好还是的扎扎实实的去搞定IOC和DI以及基于他们的实现插件。spring-boot是好用,能节约大量的编程时间,但是没有搞明白技术只是网上套用,一旦遇到问题可能就会花去更多的时间去处理。

下面记录几个简单的我却花了将近一天的时间处理的几个问题。

第一个问题可能和spring-boot关系不是很大,但是花了我快2个小时才解决,感觉得记录下。配置thymeleaf然后说找不到。错误提示已经显示classpath中没有,但是我愣是没去管classpath有没有,各种百度找thymeleaf的配置。然后各种一样的配置,各种解决不了我的问题,差点把哥哥急哭了。后来实在不行了。感觉百度不够强大,就将信将疑的去逛了下classpath,妈蛋还真没有,我就纳了闷了,新建了个项目,然后把当前项目办过去,默认都有的啊。于是乎想到build path。两个项目一对比。发现这个文件夹被添加到另外里了。就是不包含在classpath里了。然后在想想。WEB-INF这个文件夹是我在source里删除,然后又到项目里新建的。于是明白了在那里做的错误操作就要在哪里找回(只要选中对应的选项,然后再通过右边的编辑按钮编辑下就OK了)。真正的技术在于细节,在于理解。应用只是只是技术的组装。可能业务人员比技术人员更能胜任。

 

第二个问题跟spring-boot的相关性就大点了,花了我更多的时间。除了上面的那个问题和前一篇博客。到目前为止一直都在这个问题中。现在搬出来,也希望能得到高人指点。前面说了最近有点闲,加上公司在用springboot开发crm客户关系管理系统。最近刚用spring-boot做了一个webDemo。然后现在想集成热部署(spring-boot-devtools)。愣是百度加自测试弄到现在,也只是勉强说服自己集成到项目里,未来也许有用吧。

先说下百度经历,找到的文章太多,但是内容都大致相同。几分钟集成成功,几个小时也没理解为什么要集成他。先把自己的理解加网上获得的都整理下贴出来。

1.原理是两个类加载器:base classload 加载不变的依赖。  restart classload 加载变化的东西主要就是java主代码和一些测试代码了(src/java/main路径下的代码)

2. META-INF/spring-devtools.properties,都是为了添加另外(即把某些类添加到restart classload,或者将某些类从restart classload里排除)

3. restart classload 默认监听classpath里的一切变动,编译后的文件会引起重启,资源文件会引起重载Live Reload,所以要打开自动编译,当修改java时引起classpath变化

上面是从网上获取的只是,然后经过我自己的转述。但是我反复测试的结果和上面的理论却不一样。在贴下配置代码前,还是先说下本地的大环境:

window 7 + eclipse4.5/4.6 +maven3.3 + JDK8

pom.xml

 

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.5.6.RELEASE</version>
</parent>
<!--properties配置的内容会替代spring-boot自带的对应内容-->
<properties>
  <java.version>1.8</java.version>
</properties>
  <dependencies>
      <!--开发者工具-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-devtools</artifactId>
          <optional>true</optional>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>
  </dependencies>

 

application.yml配置

spring:
    devtools:
        restart:
            enabled: true #是否开启开发者工具(true/false)
            additional-paths: src/main/java
#            exclude: static/**,WEB-INF/**


网上很多人说配置 spring-boot-starter-parent + devtools + fork就可以了。我不知道他们是什么环境,但是我本地测试是没什么用,可能是IDE能自动fork子进程吧,所以不需要配置fork。从代码可以看出,我这种环境需要在pom中配置 devtools 然后在项目配置文件中通过additional-paths配置那些需要restarter的资源(由restarter loader处理),exclude配置那些在热部署是不需要重新部署的资源(由base loader 处理)。理论上restarter会监听整个classpath,我又打开自动编译了,只要改动java文件classpath就会有变化,就会重启啊。所以现在都不知道为什么,好纠结。上面的显示配置只是暂时解决问题。

 

在测试中我发现有问题,在运行模式下。即使我上面配置的可以热部署了,但是我改玩java类等部署玩后,去刷新页面,也是完全没用,还是得手动重启在刷新页面,才会看到页面变化。在调试模式下不管有没有热部署,我改完java类刷新页面都会立即看到页面变化。

哦,说一下,我是用springBootApplication启动的。我想是不是不管有没有热部署(devtools),spring-boot内嵌tomcat一直都是支持热部署的而且是全部署的。就像我们配置外部tomcat时总是会配置为热部署一样。而配置devtools时的热部署,只是部分部署(即部署指定要部署的那些资源)。由于本地项目现在还比较小,目前测下来有没有devtools效果差不多。项目如果变大的话,由于spring-boot是高层应用,依赖比较多。才能体现出来devtools的价值吧,也不很确定,希望用过的的,有经验的人路过能说两句,帮忙解惑。谢谢,谢谢

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值