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 热部署功能实现

  1. springloaded

添加mvn 依赖

mvn spring-boot:run

第2种通过 执行 app 的形式

https://blog.csdn.net/tang86100/article/details/78772079

 

  1. 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内存压榨

https://blog.csdn.net/wy674396380/article/details/80527530?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-3-80527530.nonecase

posted @ 2023-04-13 06:55  lvye1221  阅读(44)  评论(0编辑  收藏  举报