SpringBoot笔记

java web发展史 web的产生 url http 特定目录->资源 (为了返回静态资源) CGI的诞生 动态参数写进环境变量 启动CGI的程序获取参数后返回动态的结果 一个请求启动一个cgi程序,耗费自愿(腾讯部分还在用c++ php) java原始(能实现几乎所有事情) applet 浏览器插件,服务端传来代码 在插件中执行(代码不能多,不能复杂) 客户端执行代码不太好 servlet+applet 静态页+动态数据 拼接页面返回 (out.print("")) servlet\JSP (要求开发全栈) -> java web (分层架构,解耦) -> ajax (渲染部分页面,js整个技术的基石) -> spring(ssm ssh)(简化了代码量) IOC: 控制反转 依赖注入 本质:构建对象的技术 单例模式 工厂创建对象 容器 对象之间的依赖 本该我们自己管理对象 交给容器管理 并且自动注入属性 AOP: 面向切面编程 系统中有多个模块 很多模块共用某些功能 (日志 异常 事务管理) 非核心业务逻辑 交叉关注点 通用 避免了同样功能代码分散难以更新 -> springboot (简化ssm等配置 插件) 引导我们更便捷地使用spring -> 微服务 -> 未来 新技术的诞生 用来解决现有技术的痛点 异步(Netty)、响应式编程(Spring5+) 约定大于配置 后续框架更多地遵循这种原则 初识 2014.4 springboot1.0.0 简化新spring的搭建和开发过程 2017.1 Springboot1.5.0 动态日志修改 增加apache kafuka LDAP、事务管理新特性 2018.3 springboot2.0.0(历史革新) 基于java8响应式编程 http2.0支持 kotlin支持 quartz支持 security简化等 2019.9 2.1.18(稳定版) 我们学习的版本 微服务 springcloud 一种分布式架构,一种思想,一种设计原则 通过springboot创建服务,springcloud关注全局的服务治理 基于springboot的特性,我们可以快速构建独立的微服务 是java领域最优秀的微服务架构落地技术 springboot特性与优势 编码更简单 遵循约定大于配置原则 (默认配置) 测试更简单 内置七种测试框架 部署更简单 内嵌容器,集成jenkins,支持容器化(不用打war,打jar就行) 监控更简单 Actuator监控应用健康情况,SpringBoot Admin集群监控工具(便捷) maven基础 1.管理jar包,管理jar依赖 提供了本地仓库、中央仓库、远程仓库 通过坐标定位jar 中配置 2.提供统一的规范,约定优于配置,利于合作 src/main/java.. 3.扩展性好,支持各类插件,涉及到方方面面,如编译、打包、以来检察、web容器自动, 用例执行 compile编译、test测试、package打包、install安装、deploy发布 约定配置: .. 存放pom.xml和所有子目录 ../src/main/java 项目的java源代码 ../src/main/resourceses 项目的资源,比如说property文件 ../src/test/java 项目测试类 如Junit代码 ../src/test/resourceses 测试资源 ../target 打包输出目录 ~/.m2/repository mvn默认的本地仓库位置 pom.xml maven核心,Project Object Model,项目对象模型,定义了项目的基本信息 project是根元素,他还声明了一些pom相关的命名空间和xsd元素 groupId、artifactId、version三要素定义了项目的基本坐标,在mvn世界里,所有的war和jar都是依据坐标进行区分 groupId定义了组名,一般是用公司或组织的域名 artifactId定义了项目在mvn的唯一ID,一般是项目或子项目名 version定义了这个项目当前的版本 依赖范围管理: 主要管理依赖的部署,依赖范围控制哪些依赖在classpath中可用,哪些依赖包含在一个应用中,以下5个值可在scope中使用 compile 缺省值,适用于所有阶段,会随着项目一起发布 provided 只有在当jdk或者一个容器已提供该以来之后才使用(不会被打包) runtime 只有在运行时使用,如jsbc驱动,适用运行和测试阶段 test 只在测试时使用,不会发布 system 不推荐,类似provided,需要显式的提供包含以来的jar,mvn不会在repository中查找他 mvn依赖传递性 mvn默认依赖传递必须加载,但有时候,有些可以不必加载,如a-> b->c,但a不需要c,这时可以进行可选依赖和依赖排除 可选依赖 true 假设以上是A的配置,即a->b 这时编译a,ok。如果x->a,x不用到b,ok 但是x如果用到b,需在pom.xml中重新配置对项目b的依赖 依赖排除 当一个项目A依赖项目B,而项目B同时依赖C,项目A如果因为各种原因不想引入C,在配置项目B的依赖时,可以排除对C的依赖 使用: 配置镜像 ....建议阿里云 maven全局配置JDK cofg/settings.xml pom.xml helloword jdk + maven + idea + springboot 有版本捆绑关系, 示例 jdk1.8.18 mvn3.1.3+ idea2019.2+ springboot2.1.8release 1.创建maven项目 起名spring-boot-duying.demo 2.spring官网,springboot官网,resful快速构建 3.部分复制到pom里面 springboot-starter-parent 超级父pom,springboot的父依赖 ..starter-web<> web部分依赖 4.随便创建一个主入口类DemoApplication.main,创建main函数 main中使用spring静态方法启动 SpringApplication.run(DemoApplication.class,args); DemoApplication类名上加@SpringBootApplication 5.创建controller.xxController 加@Controller @ResponseBody @RequestMapping("/xxxx") xxxx() 热部署: 1.pom文件增加依赖引入 org.springframwork.boot spring-boot-devtools 2.idea的settings配置 勾选build project automatically 3.项目中命令行 osk 快捷键ctrl+shift+alt+/ ,选择registry 勾选compiler automake allow when app running 打包: 文档--getting started -- Creating an Excutable Jar ... 与dependencies同级 复制到我们的pom.xml 右侧maven Projects里面多一个springboot的选项 springboot-run 、maven-package双击 jar包打到target目录下 可以show in explore 放到某个位置 部署 cmd cd到这个路径 java -jar xxx.jar 这就成功启动了(不用要记得退出,会占用端口) 配置 配置基础 自定义banner(旗帜/标语)() 启动springboot时候表现的封面图 ../resources/banner.txt 更改启动端口 内部配置: ..resources/application.propertise/YML sever.port=8090 官网配置文件目录X Append.. 外部配置 java -jar *.jar --server.port=8081 REST @RestController controller上面,返回json 等价于controller+responsebody两个注解 返回json,而不是视图(jsp html) 配置常量 使用注解@Value(${key})获取 参数间可以互相引用three=${one}+${two} 可使用随机值${radom.int} 绑定bean(官方推荐) 一个bean bean上添加注解@ConfigurationProperties(prefix="food") 入口类上添加注解@EnableConfigurationProperties(xxBeanConfig.class) //告诉主程序要自己引入配置文件 多个bean(对应多个配置文件) 配置处理器 ..configuration-processor 到pom.xml 4.bean上加 @getter @setter 4.1 @Data 同时生成getter setter contructor hash equals tostring 4.2 @NoArgsConstructor @RequiredArgsConstructor @AllArgsConstructor无参、部分参数、全参构造器 4.3 @Builder @Slf4j 等价于private final Logger logger = LoggerFactory.getLogger(XXX.class); 原理: [源代码] 词法分析 -> (检查关键字 分析结果编程规范化的Token流) [规范Token流] 语法分析 -> (抽象语法树) [抽象语法树] 语义分析 -> (难懂的语法转化成简单的注解的抽象语法树) 如foreach -> for [注解抽象语法树] 字节码生成 -> (符合jvm规范的二进制代码) lombok原理:语法分析过程中,在编已处理后,匹配到有它注解的类,注解编译器就会自动去匹配项目中的注解对应到在lombok语法树中的注解文件,并自动编译匹配来生成方法,达到简化代码的目的 配置格式yaml propertise对于复杂的数据结构不如yaml YAML:Yaml Ain Markup Language LINUX:Linux Is Not Unix 语法规则: 1.大小写敏感 2.缩进表示层级关系 3.缩进不允许使用tab键(特别重要)(一定要在冒号后加个空格) 4.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 支持的数据结构: 1.对象:键值对集合,又称映射、哈希、字典 food: meat: 鱼香 rice: 肉丝 food: {meat: 鱼香,rice: 肉丝} 2.数组:一组按次序排列的值,又称为序列/列表 A: -d -t -y -e - id:aa age:bb sex:cc 3.纯量:单个的、不可再分的值 整数 浮点 日期....用到的时候再来找 一些特殊符号 --- ---表示一个文档的开始 --- spring: profiles:dev ...和--- 在一个配置文件中表示一个文件的结束 ~~ 做强值类型转换 > 折叠换行,|保留换行符 引用 可以用&来完成锚点定义,使用*来完成锚点引用 合并内容 主要和锚点配合使用,可以将一个锚点内容直接合并到一个对象中 多文件配置 spring: profiles: active:dev --- spring: profiles:dev sever: port:8080 --- spring: profiles:prod sever: port:8090 配置加密Jasypt (用户名、密码、..),密码一般都是加密之后存储 如果两个密码都是123 黑客也是123 同样的密码加密之后都一样 加盐加密,同样的密码加了盐也不一定一样 可以把盐理解为调料 一样的A加了不同量的b得到不同的结果 使用: 1.引入依赖 Jasypt-spring-boot-starter 2.自己写一个类 JasyptUtil 写个主函数 Main(){ BasicTextEncryptor x = new BasicTextEncryptor(); x.setPassword("123456!@#"); String userName = x.encrypt("xxxx****x"); String password = x.encrypt("*********"); //多次执行结果不一样 } 3.配置文件中使用, jasypt: encryptor: password:123456!@# xxinfo: user:ENC(密文1) pass:ENC(密文2) 模板引擎+curd 发展过程 JSP html+java代码->Servlet类->放到容器中执行 缺点 繁杂而不易维护 本质上是"模板" 通过规则和标签抽象出来的 模板引擎 freemarker velocity thymeleaf beetl(国人开窗,据说性能很高) freemarker使用最多 velocitysb不再支持 thymeleaf官方推荐 基于API的前后端分离 web服务器: 解析静态资源 nginx apache (前台接待-外网访问) 应用服务器: 解析动态+静态资源 tomcat jetty (核心价值提供者-内网访问) nginx(前端代码)->ajax请求api->tomcat(服务端代码) 数据格式json 模板引擎(thymeleaf 百里香的叶子) 执行过程 1.利用正则表达式分解出普通字符串和模板标识符 2.将模板标识符转换成普通的语言表达式 3.生成待执行语句 4.将数据填入执行,生成最终的字符串 使用 1.创建项目 使用springboot初始化器 group、artifact、jar、java8不变,package简化下 选择依赖 热部署、lombok、web.. Freemarker 引入dependency application.yml spring: mvc: view: #文件位置 prefix: /templates/ #文件后缀 suffix: .ftl controller(Model model) model.addAttribute("now",new Date().toString()) return "index" 新建 index.ftl ${xxx${now}} Thymeleaf Springboot官网就是springboot+thymeleaf编写的 特点 1.能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个web应用。便于前后端联调(动态值有一个默认的静态值) 2.模板语法并不会破坏文档结构,只会在运行期替换掉静态值 整合方式: 1.两种启动方式(模板 和 starter 两个dependency) 2.resources下创建thymeleaf文件夹,创建html文件 3.html文件 4.

name

表达式: 变量表达式 ${...} OGNL(对象导航语言)表达式,如果将Thymeleaf与Spring集成在上下文变量上(也称为Spring术语中的模型属性),则为SpringEL 选择变量表达式 *{...} 他们不是整个上下文变量映射上执行,而是在先前选择的对象 model打包参数设置为object, html中父标签绑定object ${obj},子标签绑定obj.xxx *{xxx} 链接URL表达式 @{...} 在构建URL并向其添加有用的上下文会话信息 有绝对url、相对url(网页、上下文、协议、请求等) 消息表达式 #{...} 消息表达式(通常称为文本外部化,国际化或i18n)允许从外部源(如:.properties)文件中检索特定于语言环境的消息,通过键来引用这引用消息。在Spring应用程序中,它将自动与Spring的MessageSource机制集成 构建message.properties 然后#{xxx}去文件里面找 片段表达式 ~{...} 一种简单的方法用来表示标记的片段并将其移动到模板中,由于这些表达式,片段可以被复制,传递给其他模板的参数等
xxx
xxx
xxx 字面量、文本运算、比较和相对、比较和相等、特殊标记 拼接语句 th:text 不解析标签 th:utext 会解析标签 需求分析示例 中餐厅 嘉宾:黄晓明 秦海璐 林述巍 王俊凯 杨紫 仝卓 王鹤棣 1.展示列表 2.增加、删除嘉宾 更改角色(店长、财务、大堂经理、主厨、帮厨..) 交互设计 1.展示列表页,页面中有多个按钮,每一行上面有修改和删除按钮,列表下方有增加按钮 2.点击增加时候,出现新的页面,页面需填入名字和角色两个基本信息,填好提交返回列表页 3.点击删除时,列表页更新 4.点击更改时,出现新的编辑页面,名字不可更改,角色可修改,修改提交后返回列表页 系统设计 1.实体类Guest name role 2.操作Model的方式 GuestDao 初始化的数据、数据的增删改查处理 3.业务控制逻辑GuestController 接受请求,逻辑处理,返回响应的页面 4.逻辑处理GuestService去调用相应的GuestDao 接口设计 1./guest/list 查询列表 无查询参数 返回结果:List 2./guest/toAdd 点击增加按钮 需填写名字和角色 返回add.html /guest/add 添加操作 传参Guest 返回结果:跳转到list页面 3./guest/toUpdate 点击修改按钮,返回update.html名字固定,角色可改 /guest/update 修改操作 传参Guest name 返回结果:跳转到list页面 4./guest/delete 删除操作 传参Guest name 返回结果:跳转到list页面 CURD示例 1.Springboot-inilize方式创建项目 2.group一般是公司的名字,如com.duying、com.foxconn 3.包名去掉多余的 4.依赖选择(devtools、lombok、web、模板Thymeleaf) 5.定义实体类 定义属性 实体@Data 6.定义Controller @Controller RequestMapping("guest/list") 7.定义Service 定义Interface 实现方法 @Service 8.定义Dao @Repository .. 9.Domain根据需要加一个全参构造器@AllArgsConstructor ... 10.创建list.html 加网址 通过th:each="guest:${guestList}" ${guest.xxx} 11.页面难看 下载bootstrap,放到resources/static/ 12.接口设计 13.编写业务 form表单的 th:action="@{/xxx/xx}" RESTful接口设计 特点: 与传统方式比较: 面向资源本身,具有自解释性 充分HTTP协议本身语义 取东西就要GET(GET就是安全的,不会修改服务资源),新增就要POST(POST就是不安全的),修改就要PUT(PUT就要幂等),删除就要DELETE(DELETE就要幂等) 幂等:接口可重复调用,在多次重复调用的情况下,接口最终得到的结果是一致的 传统CURD ../item/query/queryitem.action?id=1,GET ../item/saveItem.action,POST ../item/updateItem.action,POST ../item/deleteItem.action?id=1,GET/POST RESTful的CURD ../item/1,GET 查询 ../item,POST 新增 ../item,PUT 更新 ../item/1,DELETE 删除 表现层状态转化 对资源进行表现层状态转换,表现层就是资源展现的形式(格式,如xml、json、..),HTTP是无状态的,如果客户端想要操作服务器,必须让服务端的资源发生状态的转化(如user的职务),这种转化是建立在表现层上的 具体来说,就是HTTP协议里四个操作方式的动词:GET\POST\PUT\DELETE 如果客户端通过Accept头请求一种特定格式的表述,服务端通过Content-Type告诉客户端资源的表现形式 总结: 看url就知道要什么,看HTTP-method就知道干什么,看http status code就知道结果如何 设计要点 1.客户端是否支持这些HTTP方法 ·部分古老的客户端只支持GET和POST方法 ·部分框架支持通过隐藏参数_method=DELETE来传递真实的请求方法 2.状态转移问题 ·状态应该区分应用状态和资源状态,客户端负责维护应用状态,而服务端维护资源状态 ·客户端与服务端的交流必须是无状态的,并在每一次请求中包含处理该请求所需的一切信息 ·这种无状态通信原则,使得服务端和中介能够理解独立的请求和响应 3.在URL里边带上版本号的问题 ·如果我们把版本号理解成资源的不同表现形式的话,就应该只是用一个url,并通过Accept头部来区分 4.和旧方案比较 ·统一接口,可缓存,支持分层系统(允许服务器和客户端之间的中间层(代理,网关等)代替服务器对客户端的请求进行回应) 5.一句话:看url就知道要什么,看HTTP-method就知道干什么,看http status code就知道结果如何 改造Demo Controller注解改为@RESTController @RequestMapping("/guest")放在类头上,这样方法就只需要写别的就行 @GetMapping("") @PostMapping @PutMapping @DeleteMapping 参数接收 guest/toUpdate/{name} 方法中通过@PathVariable("name") 引入Jquery web jars,springboot提供了mvn以jar包依赖进行统一管理 pom.xml引入 通过<script type="text/javascript" src="@{/webjars/jquerys/3.4.1/jquery.js}"> 使用$..处理js逻辑 模板表达式 用到模板表达式的地方一定要用th:前缀(很多如url、参数地方可能会忘),不然会gg orm 对相关希映射,两大支流;不用写sql的hibernate、便于动态使用sql的mybatis 取决于业务场景 Hibernate对多表关联解决得比较差,主要针对单表 传统企业喜欢hibernate,互联网企业喜欢mybatis mybatis 可以更细致的进行sql优化 数据库移植性不好,不同的数据库写不同的sql 运行速度的优势 开放了插件接口 对复杂查询支持较好 hibernate DAO层开发比mybatis简单 对对象的维护和缓存要比mybatis好 对增删改查的对象的维护更方便 二级缓存更好,可使用第三方缓存 多表关联关系复杂,后期抓狂 jpa jpa是一种orm标准,sun公司提供的java持久化规范 Hibernate就是实现的这种标准 Spring-Boot-Jpa是spring封装的jpa规范 idea创建初始化项目时可以直接选jpa 使用 构建项目时直接勾选可以自动帮我们导入pom依赖,我们只需要控制版本就好 配置application.yml 端口号 spring: datasource: url: jdbc:mysql://**url**:*port*/dbName username: xxxx password: xxxxxx #daterSource下面不用必须加驱动,springboot会注入(url) jpa: hibernate: #自动创建表 ddl-auto: update #设置数据库引起为innerdb database-platform: org.hibernate.dialect.MySql5InnoDBDialect #打印sql语句,方便调试 show-sql: true service还是正常使用 引入mysql的连接dependency 补充app...yml 创建接口 reponsitory.xxxReponsitory 继承JpaRepository 第一个实体类,第二个主键类型 实体对象处理 @Entity @Id 主键属性 @Column 其他属性 增加无参构造器 @NoArgsConstructor 实现序列化接口 implements Servlizable 在Service引入仓库 @Autowired 私有属性 reponsitory.findAll(); mybatis 使用 配置 引入依赖、引入mysql连接池 app..yml mybatis: config-location:classpath:mybatis-config.xml mybatis-config.xml 因为已经默认加了/了,mapper文件夹前面不用加 创建sources下mybatis.mapper/xxMapper.xml 初始化项目的时候直接勾选 Dao改名为Mapper @Repository注解 xxMapper.xml
posted @ 2022-04-30 17:10  画饼躺平学习冲  阅读(70)  评论(0)    收藏  举报