爬坑心得(二)

一、gradle经验

1、在.gitignore文件中,/dist/表示根目录的dist文件,dist/表示各子工程的dist文件;

2、gradle拷贝文件时,可以用exclude排除掉其中的任意文件;

3、用gradle执行installDist时遇到了“*/bin does not exist.”这样的报错,在Windows平台下不会出现这个问题,在Linux平台下才会出现这样的报错,猜想应该是Linux平台下gradle在执行installDist后默认会校验bin目录下的文件,若不存在就会报错,具体原因可能需要阅读下gradle的源码,以后有空再研究吧。

二、若是报了空指针异常,这个问题其实很好解决,肯定是调用方为null,要么是没注入,要么是空值。

三、出现了奇怪的问题,此时要从代码入手

1、从反编译、IDE下载、GitHub上拷贝的方式来获得代码;

2、根据错误日志中的关键字搜索代码,譬如分析代码中解析.properties文件的逻辑;

3、IDEA远程连接测试环境断点调试。

四、css、js静态资源获取不到时的调试方法

1、降低spring boot的日志级别logging.level.org.springframework=DEBUG;

2、单个css、js静态资源的请求调试,每个静态资源的请求都会打印在DEBUG级别日志中。

五、Spring Boot启动时资源路径的加载过程

1、java.exe将带有conf和abc.jar的classpath参数传递给带有@SpringBootApplication注解的启动类;

2、通过Servlet工厂类AbstractEmbeddedServletContainerFactory的getUrlsOfJarsWithMetaInfResources方法从classpath中筛选出满足条件的资源路径放入静态资源url的列表中;

3、将静态资源url的列表传递给内嵌的应用容器Tomcat;

4、应用容器通过Tomcat类中的start方法启动,在运行到TomcatEmbeddedServletContainer中的findContext方法时,通过断点调试可以看到Context中的jarResources中包括了外层到/META-INF/resources的路径;

5、在请求视图时,spring boot会将Context中包含/META-INF/resources的资源路径,拼接上视图解析器ViewResolver中配置的前后缀来找到对应的视图资源。

六、在一个简化的spring mvc中,127.0.0.1:8080/abc/是如何请求到对应的视图?

1、127.0.0.1是服务器的端口,8080是配在application.properties中的server.port=8081,abc是配在application.properties中的server.context-path=/abc/

2、spring接收到请求后,程序可能会进行一个请求转发,将127.0.0.1:8080/abc/转发为127.0.0.1:8080/abc/login.do;

3、127.0.0.1:8080/abc/login.do可能会配置一个@RequestMapping来返回login视图;

4、视图解析器ViewResolver会依据配置好的prefix和suffix来增加前后缀,譬如WEB-INF/jsps/login.jsp;

5、spring会去寻找视图资源,在前面加上Context中已经载入的静态资源url,于是就成了conf或abc.jar/META-INF/resources/WEB-INF/jsps/login.jsp;

6、于是最终的请求链接其实可以理解为127.0.0.1:8080/abc/conf或abc.jar/META-INF/resources/WEB-INF/jsps/login.jsp。

七、spring boot中1.5.2.RELEASE和1.5.4.RELEASE这两个版本的Servlet工厂类AbstractEmbeddedServletContainerFactory的getUrlsOfJarsWithMetaInfResources方法在加载staticResourceUrls静态资源时略有差异。


1.5.2.RELEASE


1.5.4.RELEASE

多看几遍后可以看出差异,简单理解就是1.5.2.RELEASE版本中只判断是否为资源jar包的isResourcesJar,如果是就放入静态资源路径中staticResourceUrls.add(url),但1.5.4.RELEASE进行了升级,先判断是否为资源路径的isResourcesDir,再判断是否为资源jar包的isResourcesJar,只要任何一个满足就放入静态资源路径中staticResourceUrls.add(url)。

这个差异对我们编程的改变是什么?聪明的你一定想到了,在1.5.2.RELEASE版本中,视图文件只能放在jar包中META-INF/resources的路径内,但在1.5.4.RELEASE版本中也可以放到classpath下任意一个文件夹的META-INF/resources路径内,我们可以猜想一下spring boot版本升级后这样完善的原因,可能是视图资源放在jar包不方便查看,于是也可以让你们放到外部任何加入到classpath下的文件夹中。

PS:这里的staticResourceUrls静态资源指的是视图资源,至于配置在application.properties中用于存放css、js等静态资源的spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/目前没有出现在Context中,譬如将css、js放入static中,还需要下一步的研究。

这次在坑里掉了很久,主要是因为对开源框架内部的运行机理不清楚,没有认真去读spring boot的代码,这也是使用开源框架的问题所在,你按照他的套路来,那么会非常省心省力,但若想基于开源框架进行个性化的服务改造,就会遇到各种各样的问题,主要是因为不懂内部运行机理,代码读得太少。

所以,我们还是要抽空多看开源代码,多琢磨代码背后的运行机理,用最近看到的一位大神的话来总结——编程不过是一门失传的艺术的别名,这门艺术的名字叫“思考”。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值