用了Spring boot 2年多,感觉对它还是不太了解,这次学习也算是加深了印象,重新认识了一下spring boot
Spring boot笔记
spring boot 热部署配置(IDEA的自动部署 )
1:引入jar包 spring-boot-devtools
2:设置IDEA->Build->compiler->Build project automatically
2:Ctrl+Shift+Alt+/ 打开Maintenance选项 Registry 找到compiler.automake.allow.when.app.running 勾选value值 指定IDEA在程序运行中自动编译
spring boot
properties配置
yml配置
配置相关的注解:@ConfigurationProperties(prefix = “前缀名称”)配在class上用来收集整个配置里属性,写好了 配置文件里的属性就能注入到这个class中的属性里
引入jar包configuration-processor 引入后yml或着配置文件在 .的时候就有提示
自定义配置文件加载方式:
@PropertySource(“classpath:”) 注解进行加载自定义配置文件.
-小细节:ApplicationContext spring上下文对象 也会被放入IOC容器中 用于获取Bean 跟BeanFactory差不多
重点:configuration注解++很重要
配置类可以加载bean configuration注解中含有conponent注解
@Bean标签 加载组件类(就是没有被IOC扫描的,自定义的业务基本不会这样使用,一般都是咱们的插件初始化使用,最近常用就是HTTP拦截器,redisTemplet,mybatisPlus等插件配置)
springboot随机值和参数引用
随机数:RandomValuePropertySource类 语法就是${random.类型}
参数引用:定义新属性时引用已经定义好的属性 跟value语法一样 ${a.name}
spring boot原理深入 和源代码观察
Springboot的依赖是有父类和爷爷类来实现一些底层的依赖的,所以你在创建了一个简单的Spring boot工程后,只需要简单的添加一个 spring-boot-starter-web 就可以运行起一个完整的spring web工程. 其他jar包依赖都是在父类和其父类那面进行依赖的.starter就是使用spring boot官方的启动器进行引入组件,当然也有不是官方的,然后组件厂家自己写的.也可以自己导入而不使用spring的starter组件或者只使用web 其余都为jar包引入
springboot在加载配置类时候,使用的反向方法,正常是去扫描所有类,逐一进行检查是否有configuration注解,但是springboot初始化时 是决定大于配置的,所以先约定好这些配置类我都需要,你不想要你再排除,所以静态的写入了spring.factories,他通过注册器register将所有的配置类进行加载,判断哪些不需要,排除后再进行放入容器操作, 这就是约定大于配置的思想, 之前的spring配置都是 想用就要先配置,这很繁琐,也容易遗漏,spring boot是全部加载,自己排除,省去了一些潜移默化的bug.但加重了框架. 俗话说,有舍就有得
@SpringbootApplication
@EnableAutoConfiguration 开启了自动配置,如果@Configuration注解的类没有被@Component注解加载到IOC容器,那么就需要他来自动配置一下,这个注解只能修饰配置类
@EnableAutoConfiguration 这个注解中有个叫 exclusions属性,这个属性可以设置某些类不被自动配置,需要咱们手动配置的那些可以在这个属性排除,有些类不能被排除,必须配置,否则就会出异常,这个要注意,有可能是以后开发框架的一个BUG解决点
@ConditionalOn有多种选择 用来设置依赖配置
@ConditionalOnClass(Class) 这个注解表明了路径下必须有括号里的类才能配置生效,也是先满足这些配置才能是有当前注解标记的配置
@AutoConfigurationPackage 加上 Import(Registrar) 主要是将注册器加载,然后去扫描加载配置类
@Import(AutoConfigurationImportSelector.class) 导入select进行对boot jar包下spring配置类进行扫描筛选加载
@ComponentScan() 扫描包 需要用的就是这个
starter 就是插拔式插件,将一个组件所有的jar包都给你配置好,不用你自己再去导jar包了,也不用去管理jar包了
这人是越来越懒…
自定义starter的命名规则:自定义的话,spring官方建议你用xxx-spring-boot-starter来命名,区分springboot官方的starter
一:starter的基本条件需要添加spring-boot-autoconfigure jar包
二:编写@configuration注解的类, 自定义的重点应该在@ConditionalOnClass注解上,当路径下存在这个注解中的类时 才可以被自动配置,也就类似于依赖配置
三:编写spring.factories配置文件, register就是去这里拿所有的类,然后进行自动配置,如果这没配置,那么就去用扫描包的注解,就是componenetScan来扫描包进行配置,如果都没有 就应该异常了
spring.factories详细:
先标注个自动配置类的list名叫org.springframework.boot.autoconfiguration.EnableAutoConfiguration=\ 然后就可以在这里写上需要自动配置的类.
自定义starter相当于在Springboot的基础上写了个插件,然后交给springboot来管理,在一些高可用的功能集合里,我们就可以单独封装一个starter 结合自己的开发经验自己开发一个属于自己的插件,一些工具的封装都可以封装到这里.
Spring boot 集成持久层
spring boot(注意,不是druid)能识别的datasource配置是spring.datasource.*** 只要这么写 spring boot 就能识别到并且加载进数据源中
spring boot 整合mybatis(用mybatis-plus很好用,但是也要记住mybatis的配置,mybatis没有starter…就有个mybatis-spring…难怪人家mybatis-plus站起来了…)
配置需求:
需要配置驼峰命名规则:mybatis.configuration.map-underscore-to-camel-case=true "_"转换成后面首字母大写
扫描mapper.xml文件文职:mybatis.mapper-locations=classpath:.mapper.xml(用了mybatisPlus也要配置)
配置实体类包:mybatis.type-aliases-package=com.. sql里就不用写全路径名了.这个在固定entity包模式好使,在多业务包下不太合适…需要表达式
Spring 整合JPA 与Spring整合JPA没有什么区别.
Spring 整合redis 将实体存入redis中
@RedisHash() 这个注解指定对象在redis中的存储空间 我理解应该是个hashset的key
@Id指定实体存入redis的ID redis会生成一个hashkey
@Indexed 对这个属性生成二级索引 用于查询用 估计也是个hashkey生成的字符串 按照顺序排列
mapper中 继承改为了CrudRepository 区别于JPA的JpaRepository 也差不多 可以去研究一下redis存储实体的机制; 这样可以省去自己封装的麻烦
Spring 视图模版 Spring 对Jsp 不太支持 因为内置了tomcat undertow ,所以是jar包启动 jsp只支持war包或者文件夹.
Thymeleaf 是Spring boot 常用的一款模版
语法:
1常用的标签: 引入约定:xmlns:th=“http://www.thymeleaf.org”
th标签主要标签 th:**
2:标准的表达式:
KaTeX parse error: Expected 'EOF', got '#' at position 20: …表达式 *{}选择变量表达式 #̲{}消息 @{}URL ~{}…{ctx上下文对象,vars上下文变量,locale上下文区域设置,还有jsp的req,resp,session,context}
*{} 获取你设置的KaTeX parse error: Expected 'EOF', got '#' at position 14: {}值 #̲{}国际化配置 …{}获取
~{}标记一块模版 可以注册到指定的位置 模块化的概念 类似于vue的组件使用 这个在做组合页面的时候一定会常用的,把某些可重复用的模块提取出来,在使用的地方insert ~{} 就可以了
模块的配置
spring.thymeleaf.cache = false 是否缓存模版 dev
spring.thymeleaf.encoding=编码
spring.thymeleaf.mode = html5 模版语法模式
spring.thymeleaf.prefix = 指定模版存放路径
spring.thymeleaf.suffix = 指定模版的后缀 像freamword就是ftl
-插曲 spring boot的静态资源路径就是resources下的static templet
页面展示:
前置工作:1引入依赖,2编写配置文件 就把spring.thymeleaf.cache关了就可以 其余都不用配,3创建controller,4写页面.不会写样式…
国际化:
得把页面的显示内容都写成配置,然后模版读取这些配置进行显示,这样就可以实现不同情况用不同的配置进行显示,创建个i18n文件夹把各语言配置写在不同配置文件里,写个默认的
spring配置文件中也需要编写:spring.message.basename=i18n.login
页面手动设置国际化信息,springboot 有自动根据区域选择国际化配置的类,我们需要重写一个,定义一个类实现了localeResolver接口的方法,有个方法resolverLocale,在这里处理一下区域的选择
-小知识点:
在spring boot configuration配置中,如果重写了内置的配置类或者bean 那么在自定义配置后,需要重新对这个bean进行初始化, 如果不重新初始化,那么这个配置也不会被覆盖,还是使用内置的配置
Spring boot 缓存管理
@EnableCaching 开启自动化缓存管理
@Modifying 标明该方法是个update方法 提问:这个不写可以吗,去研究一下
-小细节:之后针对与增删改的模块方法,最好都标记上事物管理,防止一些简单的并发,如果大型,还是用乐观锁解决一下 或者redis锁住当前数据防止脏数据
-Spring data jpa中@Query注解如果不设置nativeQuery = true,那么默认写的是hpl语句,如果不写原生sql那就@entity注解就够了 写原生就得加上table注解解释一下真实表名叫什么
Redis注解缓存实现