前言

最近工作比较忙,事情也比较多。加班回到家都十点多了,洗个澡就想睡觉了。所以为了不断更太多天,偷懒写个小技巧合集吧。之后有时间都会进行文章更新的。原创不易,码字不易,还希望大家多多支持!话不多说,开始今天的技巧合集吧~

设置网站图标

原来我们在使用tomcat开发时,设置网站图片时,即icon图标时,一般都是直接替换root包下的favicon.ico替换成自己的,或者在网页的头部设置link的ref为icon然后设置其href值。而在SpringBoot中,替换图片也是很简单的,只需要将自定义图片放置在静态资源目录下即可,即默认有staticpublicresources/META-INF/resources或者自定义的静态目录下即可。

目录结构:

允许跨域访问

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

简单来说,跨域问题是可以通过nginx来解决的,或者通过jsonp(只支持get请求)来解决。而SpringBoot中也提供了配置方法。

0.利用@CrossOrigin注解,可放至在类上或者方法上。类上代表整个控制层所有的映射方法都支持跨域请求。

@CrossOrigin(origins = "http://blog.lqdev.cn", maxAge = 3600)
@RestController
public class demoController{ @GetMapper("/")
public String index(){
return "hello,CORS";
}
}

1.配置全局CORS配置。官网也有给出实例,具体如下:

@Configuration
public class MyConfiguration { @Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**").allowedOrigins("https://blog.lqdev.cn");
}
};
}
}

独立Tomcat运行

讲解了这么久,一般上我们都是通过jar包的方式进行启动的应用的。所以部署在独立的tomcat时,需要如何解决呢?其实也简单,只需要将项目打包方式修改为war包,然后修改下启动类配置即可。

0.修改pom打包方式为war,同时排除了内置的tomcat

<packaging>war</packaging>

<!-- 排除内置的tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>compile</scope>
</dependency>
<!-- 若直接有使用servlet对象时(这是废话,⊙﹏⊙‖∣),需要将servlet引入,本例是没有的~ -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>

1.改造下启动类,使其继承SpringBootServletInitializer,同时覆盖configure方法。

@SpringBootApplication
@Slf4j
public class ChapterApplication extends SpringBootServletInitializer{ public static void main(String[] args) {
SpringApplication.run(ChapterApplication.class, args);
// new SpringApplicationBuilder().sources(ChapterApplication.class).web(false).run(args);
//之后这里设置业务逻辑 比如挂起一个线程 或者设置一个定时任务。保证不退出
//不然它就是一个启动类,启动后就停止了。
log.info("jar,chapter启动!");
} @Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
log.info("外部tomcat,chapter启动!");
return application.sources(ChapterApplication.class);
}
}

2.maven打包成war(mvn clean install),然后放入tomcat中,启动运行即可。

其实这样设置的话,在开发时直接运行启动类也还是可以直接运行的,方便.

启动不设置端口

对一些定时任务服务项目,其本身只是提供一个定时调度功能,不需要其他服务调用,只是去调度其他服务。像这样的服务,正常也就不需要设置端口了。这时候SpringBoot也是支持的。只需要改下启动方式:

new SpringApplicationBuilder().sources(ChapterApplication.class).web(false).run(args);
//之后这里设置业务逻辑 比如挂起一个线程 或者设置一个定时任务。保证不退出
//不然它就是一个启动类,启动后就停止了。

或者修改配置文件的属性:

spring.main.web-environment=false

最后效果,是不是没有看见端口了:

启动完成前进行业务逻辑

利用CommandLineRunner或者ApplicationRunner可实现在SpringApplicationrun()完成前执行一些业务逻辑

0.修改启动类,实现CommandLineRunner接口,ApplicationRunner类似,只是run的入参不同而已。

@Override
public void run(String... args) throws Exception {
log.info("CommandLineRunner运行");
}

1.运行应用,注意查看控制台输出:

当然,直接申明一个bean也是可以的。

@Configuration
@Slf4j
public class CommandLineRunnerConfig {
@Bean
public CommandLineRunner runner(){
return new CommandLineRunner() {
public void run(String... args){
log.info("CommandLineRunner运行2");
}
};
}
}

若多个时,可设置@Order来确定执行的顺序。

动态修改日志级别

通过org.springframework.boot.logging.LoggingSystem提供的api即可。

loggingSystem.setLogLevel(null, LogLevel.DEBUG);

如,默认时是info模式,未修改时,debug模式是不会输出的。

动态设置后

热部署

前面讲了这么多章节,因为功能都很单一,所以一般上都是直接重启服务来进行更新操作。但当服务功能一多,启动速度缓慢时,还是配置个热部署比较方便。在SpringBoot中,只需要加入一个spring-boot-devtools即可

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

题外话:这里的<optional>true</optional>是表示依赖不会传递,依赖了此项目的需要额外引入此包,若需要使用的话。


若不生效,可试着在打包工具spring-boot-maven-plugin下的configuration加入<fork>true</fork>看看,具体配置项如下:

            <plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>

自定义启动Banner

看烦了自带的Banner,动手修改一个属于自己的Banner,提现逼格的时候到了~哈哈,以下是官网给的配置指南:

文字形式

其实,替换很简单,只需要在classpath路径下创建一个banner.txt即可。具体的一些变量官网也有给出,具体如下:

现在我们就定制一个自己的Banner

  _              _   _                       _  __                          _
| | | | | | | |/ / | |
| |__ ___ | | | | ___ ___ | ' / ___ _ __ __ _ | |
| '_ \ / _ \ | | | | / _ \ / _ \ | < / _ \ | '_ \ / _` | | |
| | | | | __/ | | | | | (_) | _ | (_) | | . \ | (_) | | | | | | (_| | |_|
|_| |_| \___| |_| |_| \___/ ( ) \___/ |_|\_\ \___/ |_| |_| \__, | (_)
|/ __/ |
|___/ ${AnsiColor.BRIGHT_RED}
Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}

题外话:手输字符画是不太现实的,大家可通过一些网站进行快速生成。可自行搜索下,网上一搜一大把。

图片形式

若觉得使用文字不够酷炫,当然也可以将图片设置为启动的banner。目前支持的图片格式有gifpngjpg。使用也很简单,只需要命名为banner即可。

如将头像放入目录中,最后的效果如下:

当然,若图片是有色彩的,也是可以的,对于太复杂的图片显示效果就不佳了,如下。

原图:

banner效果图:

是不是很酷炫~

相关资料

1、https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle

总结

本章节主要是简单的介绍了一些SpringBoot的一些小技巧,一般上也就一句话或者一个注释、一句配置就解决问题的。写这篇文章时,又去翻了翻官网的指南,很不错,每次都去看都有新发现。以上有部分就是看了写下的。确实,在看官网时,一般上是需要了解哪些知识点,就搜索直奔主题了,还没有哪次是从头看的。有时间还是耐心的看一看,就是全是英文看的有点头疼,好在代码是看的懂的,⊙﹏⊙‖∣

一点吐槽

原本是想偷懒,发一点时间完成的。最后本着有图有真相且负责的原则,为了截图展现效果,实际操作了一遍,发现时间没有和写一篇正文来的少,好尴尬。。既然说了,就简单说下,接下来的章节会涉及的知识点吧。接下来还是web开发相关,会介绍下websocket相关知识点,这部分本人也不是很熟悉,估计写的也是简单入门的,也希望会来个聊天室的实践,加深下影响。说了webSocket,那就不能把Servlet3.0提供的异步请求机制遗漏了,会介绍下原生的方式及Spring提供的方式实现,对一些异常处理,比如超时等设置也会进行说明下,既然都说的异步请求了,顺道也就讲下异步调用的相关知识点吧。至于Docker系列,鉴于本人也是初学者,写起来还是比较慢的,有时间就更吧~

最后

目前互联网上很多大佬都有SpringBoot系列教程,如有雷同,请多多包涵了。本文是作者在电脑前一字一句敲的,每一步都是实践的。若文中有所错误之处,还望提出,谢谢。

老生常谈

  • 个人QQ:499452441
  • 微信公众号:lqdevOps

个人博客:http://blog.lqdev.cn

完整实例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter

原文地址:http://blog.lqdev.cn/2018/08/11/springboot/springboot-tips/

SpringBoot | 番外:使用小技巧合集的更多相关文章

  1. IntelliJ IDEA必装插件以及SpringBoot使用小技巧合集

    IntelliJ IDEA必装插件 有不知道怎么安装的吗?File-->settings打开设置面板,找到plugins,输入想要安装的插件回车即可 1.背景图片 目前,IDEA支持设置背景图片 ...

  2. SpringBoot 使用小技巧合集

    原文:https://my.oschina.net/xiedeshou/blog/1926191 设置网站图标 原来我们在使用tomcat开发时,设置网站图片时,即icon图标时,一般都是直接替换ro ...

  3. Android Studio 小技巧合集

    本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android Studio 使用小技巧和快捷键. 根据这些小技巧的使用场景,本文将这62 ...

  4. Qt开发经验小技巧合集

    一.开发经验总结 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它, ...

  5. 62个Android Studio小技巧合集

    1书签(Bookmarks) 描述:这是一个很有用的功能,让你可以在某处做个标记(书签),方便后面再跳转到此处. 调用:Menu → Navigate → Bookmarks 快捷键: 添加/移除书签 ...

  6. npm小工具、技巧合集:让你的npm“健步如飞”

    1.解决安装速度慢问题-nrm 解决痛点 由于npm的包仓库是在国外,npm包安装速度较慢,部分包甚至无法安装. 对比cnpm的优势 1.cnpm增加了大脑的记忆和思维负担,常常需要考虑使用npm还是 ...

  7. javascript技巧合集

    转http://www.blogjava.net/zhaochengming/archive/2010/04/09/317837.html http://www.cnblogs.com/fxgachi ...

  8. Android系统级技巧合集

    Android系统级技巧合集(随时更新) #转载请注明来源# 1.高通骁龙系列查看CPU体质等级 CPU体质,即为CPU在工作频率下的电压.同一批次的CPU体质各有不同,体质越高,代表该颗CPU可在更 ...

  9. vue 实践技巧合集

    前言 本文纯属个人平时实践过程中的一些经验总结,算是一点点小技巧吧,不是多么高明的技术,如果对你有帮助,那么不胜荣幸. 本文不涉及罕见API使用方法等,大部分内容都是基于对vue的一些实践而已.由于涉 ...

随机推荐

  1. arm交叉编译 扫盲贴

    ARM交叉编译工具链 为什么要用交叉编译器? 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序, 比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平 ...

  2. BIOS MCSDK 2.0 User Guide - Acronyms and Definitions

    BIOS MCSDK 2.0 User Guide - Texas Instruments Wiki Acronyms and Definitions The following acronyms a ...

  3. 我推荐的一些C\C++书籍

    原文链接: 我推荐的一些C\C++书籍 人们常常问我有什么C++和编程的书籍推荐,也许是因为我在PowerDNS有一个关于"编写可读性良好的C++代码"的演讲.这篇博文可以作为我对 ...

  4. Sharepoint 对于是否签出文件进行编辑区别

    在库设置----版本控制设置 一.需要签出才能编辑 例如需要对以上通用盒进行修改时,若在“使用资源管理器中打开”粘贴文件时会提示必须先签出项目 签出文件后,再粘贴文件到文档库中,可以选择签入的版本类型 ...

  5. WM学习之——火山

    效果图 节点图如下: 说明: Radial grad--锥形建立节点 Perlin Noise--基础地形创建节点 Combiner--联合节点 Clamp--范围/高度控制节点 Bias/Gain- ...

  6. Ubuntu12.04安装R ,Rstudio, RHive

    环境: Ubuntu12.04 R-3.1.0 0.Ubuntu安装R官网的介绍 http://mirrors.ustc.edu.cn/CRAN/ Precise Pangolin (12.04; L ...

  7. 第六课 ROS的空间描述和变换

    1.空间描述与变换 有两个坐标系A和B,B坐标系中有一个点P,如何把B坐标系中的P映射到A坐标系呢,这就涉及到空间描述与变换, 先看一下旋转矩阵: 上面中间的行向量中的元素表示在B坐标系当中的元素用A ...

  8. Webservice 或者HttpRequest请求的时候提示 “指定的注册表项不存在”错误 解决方案

    今天又遇到神奇的事情,在使用WebService的时候居然提示“指定的注册表不存在.” The specified registry key does not exist. Google后发现,原来是 ...

  9. select下拉框如何与接口配合动态生成option选项

    前几天在做任务时考虑到这个问题,具体任务用例如下: HTML: JS:

  10. JavaScript中匿名函数循环传参数(不触发函数的执行)

    我们都知道定义函数的方式有两种,一种是函数声明,另一种是函数表达式,函数声明的语法是这样的: function functionName(arg0, arg1, arg2) { // 函数体 } 函数 ...