SpringBoot多例模式,在同一个类中注入两次是否是同一个对象 – 一不小心就会写出一个重大BUG!!- 521篇
SpringBoot基本原理,轻松应对面试官 - 第522篇
把一段音频、一张照片输入AI模型,就能让图中人物开口唱歌说话,让奥黛丽赫本唱《上春山》、陶俑仕女说英文RAP、爱因斯坦说中文段子。
在之前要做到这样的事情,一般人不敢想象,现在有了AI,自己也能成为歌唱家了!
访问下面的地址让照片唱歌,你就是下个歌手达人:
https://noisee.com.cn/#/?i=8NCBS8_WXTT
导读
应粉丝要求,已经将最近写的小技巧系列归档成一个小专栏。在文章的末尾可以看到一个标签:#SpringBoot小技巧合集,点击进去就可以看到历史所有的小技巧篇章。
小技巧系列,再有个小几篇就结束了,接下来要写哪一个方向的,还是有点迷茫了。
SpringBoot公众号文章已经写了有几年了,确实坚持写下来真的是很不容易,有时候自己也会很迷茫,我也是一个普通的人,普普通通的人。
技巧一:允许跨域访问
CORS是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing)。它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
跨域解决方案:
两个大的方向,使用SpringBoot配置的方法,不使用SpringBoot配置的方法。
不使用SpringBoot配置的方法:
(1)通过nginx来解决的
(2)通过jsonp(只支持get请求)来解决
使用SpringBoot配置的方法:
(1)利用@CrossOrigin注解,可放至在类上或者方法上。类上代表整个控制层所有的映射方法都支持跨域请求。
(2)配置全局CORS配置。
技巧二:独立Tomcat运行
讲解了这么久,一般上我们都是通过jar包的方式进行启动的应用的。所以部署在独立的tomcat时,需要如何解决呢?其实也简单,只需要将项目打包方式修改为war包,然后修改下启动类配置即可。
(1)修改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>
(2)改造下启动类,使其继承SpringBootServletInitializer,同时覆盖configure方法。
4j
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启动!");
}
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
log.info("外部tomcat,chapter启动!");
return application.sources(ChapterApplication.class);
}
}
(3)maven打包成war(mvn clean install),然后放入tomcat中,启动运行即可。
技巧三:启动不设置端口
对一些定时任务服务项目,其本身只是提供一个定时调度功能,不需要其他服务调用,只是去调度其他服务。像这样的服务,正常也就不需要设置端口了。这时候SpringBoot也是支持的。只需要改下启动方式:
new SpringApplicationBuilder().sources(ChapterApplication.class).web(false).run(args);
//之后这里设置业务逻辑 比如挂起一个线程 或者设置一个定时任务。保证不退出
//不然它就是一个启动类,启动后就停止了。
或者修改配置文件的属性:
spring.main.web-environment=false
启动看下,是不是没有看见端口了。
技巧四:启动完成前进行业务逻辑
利用CommandLineRunner或者ApplicationRunner可实现在SpringApplication的run()完成前执行一些业务逻辑
方式一:实现CommandLineRunner接口,ApplicationRunner类似,只是run的入参不同而已。
方式二:直接申明一个bean,实现CommandLineRunner。
若多个时,可设置@Order来确定执行的顺序。
技巧五:设置网站图标
原来我们在使用tomcat开发时,设置网站图片时,即icon图标时,一般都是直接替换root包下的favicon.ico替换成自己的,或者在网页的头部设置link的ref为icon然后设置其href值。而在SpringBoot中,替换图片也是很简单的,只需要将自定义图片放置在静态资源目录下即可,即默认有static、public、resources、/META-INF/resources或者自定义的静态目录下即可。
Transaction rolled back because it has been marked as - 第512篇
一文讲清楚SpringBoot项目打包jar后运行报错template might not exist - 第514篇
idea springboot woff/woff2/eot/ttf/svg等小图标不显示的问题 - 第515篇
Noisee AI中文站网页版 AI 音乐生成视频全新登场,快来抢先体验——国内第一个登场的中文站来袭 - 516篇
Spring的SmartLifecycle可以没用过,但没听过就不好了!- 第517篇
SpringBoot异常处理机制之自定义404、500错误提示页面 - 518篇
SpringBoot 中多例模式的神秘世界:用法区别以及应用场景,最后的灵魂拷问会吗?- 第519篇
SpringBoot开发的AI导航站技术架构剖析 —— 技术如何选型 - 第520篇
SpringBoot多例模式,在同一个类中注入两次是否是同一个对象 – 一不小心就会写出一个重大BUG!!- 521篇
SpringBoot基本原理,轻松应对面试官 - 第522篇
万物皆能舞,AI让你秒变“舞”林高手 – Viggle AI“舞”所不能
法定年龄退休2024年新规,我要到63岁才能退休了,看看你几岁退休,附退休对照表
又一款AI对口型神器,让照片开口说话唱歌,1分钟教会(附保姆级教程)