官网:

http://springboot.fun/

打包

<build>
<sourceDirectory>${project.basedir}/src</sourceDirectory>
<resources>
<resource>
<directory>resources</directory>
</resource>
</resources>
</build>

build 必须包含 sourceDirectory , resources , 才能打包进 jar 包。

收集到一个比较全的:

https://blog.csdn.net/xiaoyu411502/article/details/52474037

Idea 中 SpringBoot 方式启动与 Application 启动的区别

SpringBoot 启动, 命令多了以下参数 :

-XX:TieredStopAtLevel=1

-noverify

-Dspring.output.ansi.enabled=always

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=55414

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

-Djava.rmi.server.hostname=localhost

-Dspring.liveBeansView.mbeanDomain

-Dspring.application.admin.enabled=true

遇到一个问题. SpringBoot方式启动没有错误. Application启动报错:

Caused by: java.lang.ClassNotFoundException: kotlin.reflect.KotlinReflectionInternalError

对比发现: Application上添加 -noverify 就可以了.

调试

  • springboot 传参,如果参数是空的, 则不写 =

  • 代理模式用的方法: Proxy.newProxyInstance

  • 在SpringBoot2.0及Spring 5.0 WebMvcConfigurerAdapter已被废弃,目前找到解决方案就有两种

https://blog.csdn.net/lenkvin/article/details/79482205

  • HttpServlet 定义URL

    @ServletComponentScan 配合 @WebServlet ,再使用 HttpServlet

https://www.cnblogs.com/NeverCtrl-C/p/8191920.html

  • Thread.currentThread().contextClassLoader.getResource("").path

三种环境(通过 Thread.currentThread().contextClassLoader.getResource("").protocol 判断)(.path 和 .file 是相同的)

  • jar : file:/D:/JavaApp/app.shop.java/corp/target/shop-corp-3.0.0.jar!/BOOT-INF/classes!/
  • war : 没调呢。
  • file : /D:/JavaApp/pzx.java/entity/target/classes/

Jar包的情况, 可以通过获取私有字段: handler.jarFile.name 获取到: D:\JavaApp\app.shop.java\corp\target\shop-corp-3.0.0.jar

  • bootstrap.yml 早于 applicatoin.yml

http://www.jb51.net/article/139112.htm

SpringMvc 设置消息转换 设置返回Json的格式。

在所有的消息转换中找到目标,再修改。

       @Autowired
lateinit var converter: MappingJackson2HttpMessageConverter //注册返回的消息体。
handerAdapter.messageConverters.filter { it is MappingJackson2HttpMessageConverter }.map { it as MappingJackson2HttpMessageConverter }.forEach {
it.objectMapper.registerModule(CustomModule()) @Component
class CustomModule() : SimpleModule(PackageVersion.VERSION) {
init {
addSerializer(ObjectId::class.java, ObjectIdJsonSerializer());
addSerializer(LocalDate::class.java, LocalDateJsonSerializer());
addSerializer(LocalTime::class.java, LocalTimeJsonSerializer());
addSerializer(LocalDateTime::class.java, LocalDateTimeJsonSerializer()); addDeserializer(LocalDate::class.java, LocalDateJsonDeserializer())
addDeserializer(LocalTime::class.java, LocalTimeJsonDeserializer())
addDeserializer(LocalDateTime::class.java, LocalDateTimeJsonDeserializer())
}
} class LocalTimeJsonSerializer : JsonSerializer<LocalTime>() {
override fun serialize(value: LocalTime?, generator: JsonGenerator, serializers: SerializerProvider) {
if (value == null) {
generator.writeNull()
} else {
generator.writeString(value.AsString())
}
}
}
}

设置默认字符集

        //设置 StringHttpMessageConverter 的字符集
handerAdapter.messageConverters.filter { it is StringHttpMessageConverter }.map { it as StringHttpMessageConverter }.forEach {
it.setWriteAcceptCharset(false)
it.defaultCharset = Charset.forName("utf-8")
}

设置请求参数与Action函数参数对应关系

var listResolvers = mutableListOf<HandlerMethodArgumentResolver>()
listResolvers.add(RequestParameterConverter(listOf(ApiParam::class.java))); listResolvers.addAll(handerAdapter.argumentResolvers ?: listOf()) handerAdapter.argumentResolvers = listResolvers;

执行 Test 的时候, Bean 不创建的问题

设置 test resource , 重新 import 会失效.

在 project structure -> module -> 设置 test resources 时,下面有提示. 任何改变都会让它失效. 所以. 设置 test resource 是最后一步.

classLoader

Thread.currentThread().contextClassLoader 有 私有字段 classes ,表示加载之后的类。 类的加载有过程,在 Test 环境下,发现有的项目在执行Test时,当前项目的类并没有完全加载。

Bean的初始化.

调试中发现, Bean 并没有自动创建 .

解决

启动类上,添加 @Import ,让它强制执行,可以让该 Bean 强制创建 . 这种方法没有解决根本问题, 因为有大量的Bean.

找到原因如下:

SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描的。

所以,

  • 把 Test 的启动类的包名,改为 Bean 的顶级包名即可.

    如: Bean包名: com.abc.def , Test启动类包名: com.abc 或 com 均可.

  • 或者 @ComponentScan(basePackages=arrayOf("com","org"))

    经测试, 这个方法在 spring-boot 下不行。

  • 使用: @SpringBootApplication(scanBasePackages = arrayOf("nbcp","pandian"))

    scanBasePackages 写所有启动加载的包。

见: https://zhidao.baidu.com/question/716351765859826445.html

定时任务总开关

https://my.oschina.net/jspp/blog/1604553

上文说的测试了一下,没有效果.

@Component open class

对于 @Component 注解的 class ,一定不能是 final , 必须是 open的. 因为Srping会使用 cglib 继承自该类, 重写该类的方法.

取消Filter自动注册

https://www.jianshu.com/p/bf79fdab9c19

取消自动连接数据库:

https://blog.csdn.net/u012240455/article/details/82356075

@EnableAutoConfiguration(exclude = arrayOf(DataSourceAutoConfiguration::class))

新建非Web SpringBoot项目.

http://www.jianshu.com/p/5d4ffe267596

继承 CommandLineRunner

@SpringBootApplication
class SpringBootConsoleApplication : CommandLineRunner { companion object {
@Throws(Exception::class)
@JvmStatic
fun main(args: Array<String>) {
//disabled banner, don't want to see the spring logo
val app = SpringApplication(SpringBootConsoleApplication::class.java)
app.setBannerMode(Banner.Mode.OFF)
app.run(*args) }
} // Put your logic here.
@Throws(Exception::class)
override fun run(vararg args: String) { fixTagData() exit(0)
}
}

EnableRedisHttpSession

Redis数据库会有: spring:session:sessions:2519c4cb-4dfb-42c7-9c19-334cc2800e54 的 Hash数据。里有有以下Field:

maxInactiveInterval

sessionAttr:ValidateCode

lastAccessedTime

sessionAttr:PzxSession

creationTime

Java如何读出?
读出字符串容易: var d = rer.jedis(11).jedis.hget("spring:session:sessions:" + id, "sessionAttr:PzxSession")。
反序列化。 ObjectInputStream( ByteArrayInputStream(d.toByteArray().toMutableList().slice(6).toByteArray())).readObject() 报错: invalid stream header: EFBFBDEF, 因为: 读出String的时候就已经错了。原因: https://www.cnblogs.com/yanlong300/p/7692595.html
如何读出二进制流?
var data = rer.jedis(11).jedis.hget (("spring:session:sessions:" + id).toByteArray(), "sessionAttr:PzxSession".toByteArray())
var stream = ObjectInputStream(ByteArrayInputStream(data));
var ent = stream.readObject() as PzxSessionData;

JSessionID 的值 。

JSESSIONID == Base64( request.requestSessionId )

spring:session:sessions:${request.requestSessionId}

spring:session:sessions:${request.requestSessionId}. sessionAttr:${ session.key } == serial ( session.value )

SpringBoot笔记的更多相关文章

  1. SpringBoot笔记十六:ElasticSearch

    目录 ElasticSearch官方文档 ElasticSearch安装 ElasticSearch简介 ElasticSearch操作数据,RESTful风格 存储 检查是否存在 删除 查询 更新 ...

  2. SpringBoot笔记一

    1 开始 1.1 spring介绍 Spring Boot使开发独立的,产品级别的基于Spring的应用变得非常简单,你只需"just run". 我们为Spring平台及第三方库 ...

  3. 【SpringBoot笔记】SpringBoot整合Druid数据连接池

    废话少说,按SpringBoot的老套路来. [step1]:添加依赖 <!-- 数据库连接池 --> <dependency> <groupId>com.alib ...

  4. SpringBoot笔记十七:热部署

    目录 什么是热部署 Devtools热部署 什么是热部署 热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用. 举个例子,王者荣耀的更新有时候就是热部署,热更新,就是他提示你更新,更新40 ...

  5. SpringBoot笔记十四:消息队列

    目录 什么是消息队列 消息队列的作用 异步通信 应用解耦 流量削峰 RabbitMQ RabbitMQ流程简介 RabbitMQ的三种模式 安装RabbitMQ RabbitMQ交换器路由和队列的创建 ...

  6. SpringBoot笔记十三:引入webjar资源和国际化处理

    目录 什么是webjar 怎么使用webjar 国际化 新建国际化配置文件 配置配置文件 使用配置文件 我们先来看一个html,带有css的,我们就以这个为准来讲解. 资源可以去我网盘下载 链接:ht ...

  7. springboot笔记1(转载于puresmile)

    构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

  8. springboot笔记05——profile多环境配置切换

    前言 一个应用程序从开发到上线,往往需要经历几个阶段,例如开发.测试.上线.每个阶段所用到的环境的配置可能都是不一样的,Springboot 应用可以很方便地在各个环境中对配置进行切换.所以,今天主要 ...

  9. springboot笔记09——使用aop

    什么是AOP? aop(Aspect Oriented Programming)面向切面编程,是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装 ...

随机推荐

  1. Cannot find wrapper assembly for type library "ADODB". in VS2017

    Delete Microsoft ActiveX Data Objects {version} Library and then add it back. After resolving the pr ...

  2. 【PAT】B1060 爱丁顿数(25 分)

    逻辑问题,对我来说还是挺有难度的,一开始想不通 我输入数据并以数据为下标,数据出现次数为内容存储 然后从后遍历计算所有大于当前下标的元素出现的次数 最后遍历一遍确定是否为爱丁顿数,如果大于当前已经找到 ...

  3. January 26th, 2018 Week 04th Friday

    A great forest is set on fire by a small spark. 最小的火能点着最大的树林. It is just a spark, but it is enough t ...

  4. Eclipse中定位当前文件在项目中的位置

    点击红色框内的按钮,就能定位当前文件在项目中的位置, 另外, 找到位置后记得再点击一下这个按钮, 要不然每次打开一个文件都会自动定位

  5. TG可能会用到的动态规划-简易自学

    最新更新 完整校订版见此 戳我阅读 以下为未核对不完整版本. 因版权原因,完整精校版不向所有公众开放. 请从您找到本博客的地址查找附带密码(比如简书分享了本网址,请您从简书分享页底部查询密码),感谢您 ...

  6. 个人技术博客--团队Git规范(参考西瓜学长)

    援引西瓜学长:GitHub团队项目合作流程 废话少说直接写 1.fork 1.对于组员来说第一步就是fork 2.点击fork之后 上面是我们的团队仓库 切换回自己的仓库 就会看到 是fork于团队仓 ...

  7. linux系统自签发免费ssl证书,为nginx生成自签名ssl证书

    首先执行如下命令生成一个key openssl genrsa -des3 -out ssl.key 1024 然后他会要求你输入这个key文件的密码.不推荐输入.因为以后要给nginx使用.每次rel ...

  8. [国家集训队] calc

    嘟嘟嘟 这道题dp虽然不难,但是我还是没推出来,感觉最近脑子不太好用啊. 于是就跑去问神仙gjx(全国前三!)了.(外出集训真是好) 神仙不愧是神仙,一会儿就想出来了,而且方法还比网上的题解好懂. d ...

  9. 【转】字符编码笔记:ASCII、Unicode、UTF-8 和 Base64

    1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态(-128~127),这被称为一 ...

  10. 项目Alpha冲刺(团队)-第六天冲刺

    格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队)-代码规范.冲刺任务与计划 团队名称:为了交项目干杯 作业目标:描述第六天冲刺的项目进展.问题困难.心得体会 ...