SpringBoot开发案例之奇技淫巧

程序员都有着一种天生的好奇心,这种好奇心引导着我们的编程生涯。写几行代码,装载到计算机里,让它按照你的思路工作,这是非常有趣的事情。但随着开发的东西越来越多,我们变的越来越忙,这种好奇心会慢慢的减退。我们应该时不时的用一些新思路挑战自己,让自己的思想保持锋锐和专注,提醒自己为什么当初选择码农这条道路。

版本标注

小伙伴们可能会发现pom.xml中很多是没有版本号的比如:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
</dependency>

其实,在头部我们加了以下配置:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/>
</parent>

spring-boot-starter-parent包含了大量配置好的依赖管理,在自己项目添加这些依赖的时候不需要写版本号

热部署

方法1 添加springloaded依赖

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>springloaded</artifactId>
     <version>1.2.5.RELEASE</version>
</dependency>

原理:基于ASM实现动态生成类或者增强既有类,每次类的修改会被检测到,然后重新生成新的类并加载。如果不懂什么是ASM可以百度JAVA-ASM。

方法2 添加spring-boot-devtools依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
</dependency>

原理:spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)。

配置文件

在 spring boot 中,有两种方式实现文件配置,application.properties 和 application.yml。大家可能对properties 比较熟悉,而另一种yml是基于YAML实现的,YAML 是一种比JSON(json多层次{ 与 [ 会被搞晕的)更直观的表现形式,展示上更易查错和关系描述。因为不需要一个专业工具就可以排查正确性。

下面,我们以server为例展示下两者的不同。

application.properties

server.context-path=/springboot
server.port=8080
server.session-timeout=60
server.address=192.168.1.66

server.tomcat.max-threads=300
server.tomcat.uri-encoding=UTF-8

application.yml

server:
    context-path: /springboot
    port: 8080
    session-timeout: 60
    address: 192.168.1.66
    tomcat:
      max-threads: 300
      uri-encoding: UTF-8
logging:
    level:
      root: INFO

yml天然的树状结构,一目了然,层次感强,有没有亮瞎你。当然使用yml要注意,层次间隔必须是空格不能是TAB,并且属性名的值和冒号中间必须有空格。

部署环境

开发环境(development)
application-dev.properties

测试环境(test)
application-test.properties

生产环境(production)
application-prod.properties

那么如何定义使用哪种配置文件呢?
  在主配置文件application.yml中配置如下:

spring:
  profiles:
    active: dev

属性配置

如何在代码中获取配置文件中的属性呢?spring-boot为我们提供了这样一种方式,只需要使用@Value注解即可。

@Value("${spring.mail.username}")
public String USER_NAME;

thymeleaf模版

默认配置下,thymeleaf对html的内容要求很严格,比如,如果少最后的标签封闭符号/,就会报错而转到错误页。

#忽略thymeleaf严格的校验
spring.thymeleaf.mode=LEGACYHTML5

#开发阶段设置为false方便调试
spring.devtools.livereload.enabled=true
spring.thymeleaf.cache=false
spring.thymeleaf.cache-period=0
spring.thymeleaf.template.cache=false

静态资源

Spring Boot中静态资源(JS, 图片)等应该放在什么位置?

Spring Boot能大大简化WEB应用开发的原因, 最重要的就是遵循“约定优于配置”这一基本原则。Spring Boot的关于静态资源的默认配置已经完全满足绝大部分WEB应用的需求。没必要去弄手续繁杂的自定义,用Spring Boot的约定就好了。

在Maven 工程目录下,所有静态资源都放在src/main/resource目录下,结构如下:

src/main/resource
          |__________static
                        |_________js
                        |_________images
                        |_________css
                 .....

比如,我们引入以下css:

<link rel="stylesheet" th:href="@{css/alipay.css}" />

自定义静态资源

通过配置文件配置

在application.properties(或.yml)中配置

# 静态文件请求匹配方式
spring.mvc.static-path-pattern=/**
# 修改默认的静态寻址资源目录 多个使用逗号分隔
spring.resources.static-locations = classpath:/templates/,classpath:/resources/,classpath:/static/

通过代码配置

@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.itstyle.modules" })
public class Application extends WebMvcConfigurerAdapter {
    private static final Logger logger = Logger.getLogger(Application.class);
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/cert/**").addResourceLocations(
                "classpath:/cert/");
        super.addResourceHandlers(registry);
        logger.info("自定义静态资源目录");
    }

    public static void main(String[] args) throws InterruptedException,
            IOException {
        SpringApplication.run(Application.class, args);
        logger.info("支付项目启动 ");
    }

}

文件操作

获取文件

File file = ResourceUtils.getFile("classpath:cert/readme.txt");

获取路径

ClassUtils.getDefaultClassLoader().getResource("cert").getPath()

Controller和RestController的区别?

官方文档:
@RestController is a stereotype annotation that combines @ResponseBody and @Controller.
意思是:
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。

1)如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
例如:本来应该到success.jsp页面的,则其显示success.

2)如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
3)如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

作者: 小柒

出处: https://blog.52itstyle.com

本文版权归作者和所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件([email protected])咨询。

时间: 2017-08-01

SpringBoot开发案例之奇技淫巧的相关文章

SpringBoot开发案例之整合mail队列篇

前言 前段时间搞了个SpringBoot开发案例之整合mail发送服务,也是基于目前各项目平台的邮件发送功能做一个抽离和整合. 问题 以发送方为例,比如网易的反垃圾邮件政策,过多或者频率过快的发送都会被判定为垃圾邮件,即使发再多的邮件也无济于事.当然如果是自建邮件服务器,也是要考虑发送服务的并发能力. 以接收方邮件为例,比如腾讯邮箱就有类似说明:如果内容涉嫌大量群发,并且被多数用户投诉为垃圾邮件,也就通过不了收件方的"安检",如下图: 方案 为了解决以上实际场景中遇到的问题,使得其更像

SpringBoot开发案例之整合Spring-data-jpa

即使你是天才,如果你不努力,你也会被其它人超越. 扯淡 扯了那么多篇SpringBoot的相关案例,基本每行代码都是博主纯手工编写,附代码案例,懂Maven和Git的小伙伴必须可以手到擒来. SpringBoot使得开发变的更加简洁,快速,当然被封装的越来越深.此时你就要引入越来越多的第三方工具类,虽然你可以把搭建好的项目运行起来,却无法理解是怎么跑起来的.有些人带着疑惑查阅文档,阅读源码,多年以后便成了大牛:有些人不求甚解,能跑就行,就这样干了N年CURD. 俗话说的好,燕雀安知鸿鹄之志哉?然

SpringBoot开发案例之整合Dubbo提供者(一)

既然是开发案例,显然不会扯那么多老婆舌,有不清楚这两个东东的请自行百度. 开发环境 JDK1.7.Maven.Eclipse.SpringBoot1.5.1.Dubbo2.8.4 项目结构 相关配置 pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation

SpringBoot开发案例之整合mongoDB

开始前,建议大家去了解以下文章,当然不看也没问题: MongoDB从入门到"精通"之简介和如何安装 MongoDB从入门到"精通"之如何优雅的安装 MongoDB从入门到"精通"之整合JavaWeb项目 开发环境 JDK1.7.Maven.Eclipse.SpringBoot1.5.2.mongodb3.4,Robomongo(可视化工具) 项目结构 相关配置 pom.xml: <project xmlns="http://mav

SpringBoot开发案例之整合mail发送服务

上个月做过这样一篇分享笔记,微服务架构实践之邮件通知系统改造. 当时用的是开源的第三方插件mail和Thymeleaf做发送服务,显然这样子你需要配置一些东西,麻烦!!!接触了Spring Boot以后,显然有更好的解决方案,我们只需要引入spring-boot-starter-mail模块就实现了自动化配置. 好,废话不扯,言归正题(文中大部分是部分代码,详细代码见Git). 开发环境 JDK1.7.Maven.Eclipse.SpringBoot1.5.2.spring-boot-start

SpringBoot开发案例之整合日志管理

有一种力量无人能抵挡,它永不言败生来倔强.有一种理想照亮了迷茫,在那写满荣耀的地方. 概述 参考文档:Logging 这里顺便引用以下部分原文,当然看不明白也没关系,我们有有道翻译,如果翻译的不准确,后面会提供详细配置分享给大家. Spring Boot uses Commons Logging for all internal logging, but leaves the underlying log implementation open. Default configurations a

SpringBoot开发案例之整合Dubbo消费者

有人卖就有人买,显然是亘古不变的真理,前两篇讲解了SpringBoot+Dubbo的提供者的几种暴露方式,这篇跟大家分享一下消费者如何去订阅属于自己的服务. 相信,下图大家一定不陌生吧:注册中心,消费者,容器(提供者),监控中心.线框图也是画的如此清晰,这里就不跟大家详细的概述了. 开发环境 JDK1.7.Maven.Eclipse.SpringBoot1.5.1.Dubbo2.8.4 项目结构 实体类和业务接口,这里就不展示了,与提供者代码同步即可(自行打包引入或者复制). applicati

SpringBoot开发案例之整合Swagger篇

前段时间整合过的一个支付服务,由于使用了Spring Boot快速开发,但是又懒得写详细的文档介绍,便顺手就把Swagger整合进来了,对支付服务进行分组API展示,如上图. 简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新 .接口的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步.Swagger 让部署管理和使用功能强大的API从未如此简单. 在实际开发过

SpringBoot开发案例之集成SSL证书

推荐阅读:阿里云盾证书服务助力博客装逼成功 SSL简介 SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议.TLS与SSL在传输层对网络连接进行加密. SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持.SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议