Springboot
SpringBoot 介绍
简介
Pivotal团队提供,
从start集合,约定优于配置
本质是工具的集合,不需要管理版本
特点
独立的Spring配置,自动配置
嵌入tomcat,可以打包成jar包
简化maven
自动配置spring
提供生成就绪功能
使用场景
restful 风格的 微服务的架构
自动化方便,Nginx 负载均衡,横向扩展
工具整合, redis, solar,edc
教程
SpringBoot 入门系列 https://blog.csdn.net/isea533/article/details/50278205
Spring中基础知识
Spring中@Service单例的理解
https://blog.csdn.net/Plum_wine/article/details/83719887
Service 创建的单例对象是整个服务器容器中的单例
而是整个服务容器里的单例。
所以这家餐厅并不是进去一个人跟一个服务员,而是不管进去多少人,都是这个服务员,只是他够快。看到这如果觉得浪费了你几分钟,那就不好意思
StringBuffer 与 StringBuilder
StringBuffer为什么是线程安全的,StringBuilder为什么不是是线程安全的
https://blog.csdn.net/u014705854/article/details/80815102
StringBuffer 主要接口
https://blog.csdn.net/jiutianhe/article/details/42171261
查找方法 synchronized int indexOf(String subString, int start)
// 添加字符串 stringBuffer.append("I love you"); // 删除 [0,2) 之间的所有字符,此操作会改变 stringBuffer 的值 // stringBuffer.delete(0, 2); // 查找子字符串所处的位置 int pos = stringBuffer.indexOf("ov"); stringBuffer.delete(0, pos); System.out.println(stringBuffer);
SpringBoot 快速创建一个对象的方式
@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名
https://www.cnblogs.com/feiyu127/p/7700090.html
mooc 课程
springboot 热部署功能实现
- springloaded
添加mvn 依赖
mvn spring-boot:run
第2种通过 执行 app 的形式
https://blog.csdn.net/tang86100/article/details/78772079
- spring-boot-devtools
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
https://blog.csdn.net/u012190514/article/details/79951258
Spring DevTools 介绍
https://blog.csdn.net/isea533/article/details/70495714
Intellij IDEA 使用Spring-boot-devTools无效解决办法
https://blog.csdn.net/liu911025/article/details/81503479
【注意】按照文章中的配置后,偶尔还是不能自动编译。那么改好后,手动编译文件即可。 Alt+Cmd+Shift+F9
视频课程地址:
https://www.imooc.com/learn/915
学习笔记
Tomcat, JBoss, Jetty,
开启热部署的方式
开发提示时间
银行,淘宝,全年不间断运行的情况
不需要重新启动服务器的
调试代码的效率
关于 war, jar 包的发布
热部署: 发布,替换war包, Web服务器,游戏服务器; 直接重新加载整个应用程序;适用产品模式
热加载: 编译,替换class文件; 适用开发模式
基于Java的类加载实现
初始化JVM -> 启动类加载器(ClassLoader) -> 标准扩展类加载器 -> 系统类加载器 -> 加载class文件(由父类处理)
源码对象,
加载 -> 验证 -> 准备 -> 解析 -> 初始化
1. 遇到new,getstatic,putstatic和invokestatic这4条指令时,如果类没有初始化时,必须初始化类。四条指令对应我们日常所见的 使用new关键字实例化对象,读取一个类的静态字段,设置一个类的静态字段(被final修饰的静态字段除外,因为已在编译期把结果放入常量池中了)和调用一个类的静态方法。
2. 对类进行反射调用时。
3. 当初始化一个子类时,发现其父类没有初始化,则需先出发其父类的初始化。
4. 当虚拟机启动时,一个类包含main()方法时,当前类需要初始化
5. 但是用动态语言支持时,如果一个java.lang.invoke.MethodHandle实例后解析结果REF_putStatic,REF_getStatic,REF_invokeStatic的方法句柄时,当改方法句柄对应的类没有初始化时,需要初始化该类。(动态语言支持详情请查看)
---------------------
作者:sunjiaminaini
原文:https://blog.csdn.net/sunjiaminaini/article/details/76984972
案例
shiro整合jwt前后端分离权限认证示例
https://gitee.com/haiyang9352/shiro-jwt-springboot
获取本机IP及端口
在Spring Boot 2.0.0 M1之后,EmbeddedServletContainerInitializedEvent已经改名 为WebServer 了
https://blog.csdn.net/anurnomeru/article/details/80236747
提到除开127.0.0.1 外,还可以获取到其他网卡的IP
https://blog.csdn.net/huxiangen/article/details/70895730
测试用例启动
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
https://www.oschina.net/question/3009937_2231116
部署及启动
java -jar -Dserver.port=10000 -Dlogging.path=/var/logs xxx.jar & -- 默认在/var/logs/生成spring.log文件 java -jar -Dserver.port=10001 -Dlogging.file=/var/logs/yyy.log yyy.jar & -- 指定虚拟机内存、日志文件、配置文件,启动SpringBoot项目 java -Xms256m -Xmx512m -jar -Dlogging.file=/var/logs/ebag-school.log LK-school-1.0.jar --spring.config.location=school-prod.yml &
读取 yml 自定义字段的值
java 中:
@Value("${text}") private String text;
yml 中配置
text: 我是服务提供者1,张三。
slf4j 日志记录
private static final Logger log = LoggerFactory.getLogger(ResolveController.class);
log.info("设备id: {},收到数据!", devId);
其中格式化是采用 {} 形式输出的
logback-spring.xml
<!--1. 输出到控制台--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> <encoder> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender>
输出到控制台
输出到HTML页面
循环输出
<!-- 2.2 level为 INFO 日志,时间滚动输出 --> <appender name="HTML_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文档的路径及文档名 --> <file>${log.path}/index.html</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志归档路径以及格式 --> <fileNamePattern>${log.path}/index-%d{yyyy-MM-dd}.%i.html</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>1MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文档保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!--日志文档输出格式--> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <charset class="java.nio.charset.Charset">UTF-8</charset> <layout class="ch.qos.logback.classic.html.HTMLLayout"> <!--<pattern>%p%d%msg%M%F{32}%</pattern>--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n</pattern> </layout> </encoder> <!-- 此日志文档只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>
集成 socket
SpringBoot集成Socket服务后打包(war包)启动时如何启动Socket服务(web应用外部tomcat启动)
https://www.cnblogs.com/threadj/p/10553238.html
打包成 war 不能启动 socket 问题
SpringBoot 集成 WebSocket 遇到的问题
https://www.xncoding.com/2017/07/16/spring/sb-socketio.html
SpringBoot系列 - 集成SocketIO实时通信
https://blog.csdn.net/qq_15807785/article/details/83547978
基于 socket.io 来说,采用 node 实现更加合适,本文使用两个后端的Java开源框架实现。
业务需求是将之前通过轮询方式调动RESTFul API改成使用WebSocket长连接方式,实现要服务器实时的推送消息
SpringBoot 整合 Tomcat 的 WebSocket 服务端
https://blog.csdn.net/wangmx1993328/article/details/84582904
SpringBoot之集成Socket
开始Socket服务端实现,Socket相关接口在java.net包中已经存在,所以这里不需要再做额外的引用 3.1、SocketServer,是Socket服务端核心 https://www.cnblogs.com/threadj/p/10553048.html Socket配置,这样,在启动SpringBoot应用的时候,就会将Socket服务也一并启动(此处有坑,也就是启动方式的问题,使用内置的tomcat启动是可以这样操作的,如果打包为war包在外置的tomcat进行启动,那么这里的设置是无效的,如何操作:)
https://www.cnblogs.com/devise/p/10820810.html
WebSocket是通过单个TCP连接提供全双工(双向通信)通信信道的计算机通信协议。此WebSocket API可在用户的浏览器和服务器之间进行双向通信。用户可以向服务器发送消息并接收事件驱动的响应,而无需轮询服务器。 它可以让多个用户连接到同一个实时服务器,并通过API进行通信并立即获得响应。
【重点示例】 web socket https://www.cnblogs.com/devise/p/10820810.html
可以 获取到 socket 下的连接,接收 socket 发送的消息, 但没有解决 如何 从客户端那边接收 信息的问题。
Maven插件
打包成windows服务的插件
https://github.com/JoyLau/joylau-springboot-daemon-windows
部署
linux 下:
nohup
nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
nohup 是 no hang up 的缩写,就是不挂断的意思。
在上面的例子中,0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) ;
nohup command > myout.file 2>&1 &
(2) &
加载一个命令的最后面,表示这个命令放在后台执行
有两个命令可以来查看,ps 和 jobs。区别在于 jobs 只能查看当前终端后台执行的任务,换了终端就看不见了。而ps命令适用于查看瞬时进程的动态,可以看到别的终端的任务。
Ubuntu 下
apt-install install cronolog
优化内存占用
Spring boot内存压榨