| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 【springBoot】SpringMVC(bg),SpringBootServletInitializer,springBoot一体化测试 -> 正文阅读 |
|
[Java知识库]【springBoot】SpringMVC(bg),SpringBootServletInitializer,springBoot一体化测试 |
SpringBoot 内容管理SpringMVC、Data-Access和SpringBoot
Spring (bg)昨天对于只是分享了一些Spring部分的bg,这里再分享一下MVC和boot的相关,同时以开发为主,分享常用注解,正式开始以开发的角度来梳理SpringBoot,拥抱SpringBoot时代! spring MVCspringMVC其实就是Spring内置的MVC框架,是一个基于java的实现MVC设计模式的请求驱动的Web框架,MVC就是model,view、controller,核心思想就是将业务逻辑、数据和显示分离来组织代码 在MVC之前,经历了model1时代和model2时代: model1时代就是几乎完全依赖JSP,少量的JavaBean处理数据库连接共同组成项目 -----> model2时代,有了Servlet,所以就是Model(java Bean) + view (Jsp) + controller(Servlet)组成雏形的MVC, 但是model2时代的封装性还是不够,需要重复造轮子【比如之前一个Servlet类只能处理一个请求,实现HttpServlet,重写相关的get和post方法】 ------ > Spring MVC时代: spirng mvc是最优秀的MVC框架,完全契合Spring,SpringMVC下一般将后台分为Servie、Dao、entity层 SpringMVC工作原理这个和之前的Bean周期一样都是一套流程【Bean中的主要就是解析,实例化,Aware接口判断,初始化(Beanpostprocessor) Beanpostprocessor后置处理的时候SpirngAop会进行织入 ---->增强这个对象的方法,之后注册一下destruction回调 —> 什么时候激活, 使用之后判断是否实现了disposableBean,调用自定义的destroy方法销毁bean】 SpringMVC当然还是会和model2时代的Servlet有关联,最核心的就是中央处理器DispacterServlet; 还有HandlerMapping处理映射器,以及HandlerAdapter处理适配器,ViewResolver视图解析器
Spring框架中的设计模式首先就两个核心思想来说,AOP运用到了代理设计模式,IOC运用到了工厂模式,单例Bean ----> 单例模式【懒汉式存在安全问题,因为static赋值的是null,可能创建多个对象,饿汉直接赋值,不存在安全问题】 SpringMVC的处理适配器还有AOP的advice适配器都运用到适配器模式 jdbcTemplet,redisTemplate等都使用到了模板方法模式 连接不同的数据库,动态切换数据源 —> 包装器模式 Spring的事件驱动模型 --> 观察者模式 Spring中管理事务的方式Spring中管理事务主要就是编程式事务和声明式事务
Spring中的事务传播行为事务传播行为 ----> 管理业务层方法相互调用的事务问题 当事务方法被另外事务调用的时候,必须要指定传播行为: 被调用的方法到底在当前事务中执行,还是重写开启一个事务 主要的就是4个,常用的式required和requires_new
所以简单记忆就是:required存在加入,不存在创建; requires_new: 不管存在都创建; nested: 都创建,存在时不挂起,嵌套; mandatory: 存在创建嵌套,不存在报错 还有3种隔离级别时非事务的方式运行 事务不会回滚, supports: 有则加入,无则非事务运行; not_supported:以非事务方式运行,不管是否有事务,挂起; never: 非事务运行,存在事务抛异常 【mandatory和never恰好两个极端,一个不能存在抛异常,一个存在抛异常】 Spring事务隔离级别四个: TransactionDefinition.ISOLATION_ READ_UNCOMMIT ; 对应的一级封锁协议,只是解决了丢失修改,加了X🔒,READ_COMMITED: 对应二级封锁协议:解决了脏读 ,读取过程加S🔒【还有幻影读和不可重复读】;REAPETABLE_READ: 对应三级封锁协议: 解决了不可重复度,但是幻读还是有的【MYSQL的貌似没有】,SERIALIZABLE: 可串行化,没有并发问题,性能太低了【不管操作的是不是同一个数据】 @Transactional(rollbackFor = Exception.class)@Transactional是事务的全注解,放置在业务方法的上面或者类的上面【该类的所有的public方法都具有该类型的事务属性】,可以通过propagation属性指定事务传播行为,通过isolation指定事务的隔离级别,而rollbackFor属性就是指定当遇到什么类型的异常时回滚,当指定为Exception.class时就会遇到任何异常都回滚 当不加rollbackFor属性时,只有碰到RuntimeException才会回滚; 加了Exception.class,因为Exception是所有异常类的超类,包括运行时或者非运行时异常【检查】,都会回滚 JPA 全自动持久层框架java persistent API,JPA是一种规范,简化了持久化的开发,SpringDataJPA【Hibernate】是一套全自动框架,自动生成的sql可读性差,Mybatis是半自动的框架,需要手动写sql【所以Mybatis-plus出现与JPA抗衡】
如果想让entity中的某个字段不被持久化,可以使用注解@Transient transient 瞬态刚好和persisten相反 或者使用transient关键字/final/static修饰变量 SpringBoot自动装配Spring时代使用第三方依赖,需要写配置文件bean或者通过JavaConfig配置相关的对象,比如使用Mybatis框架,就需要配置sqlSessionFactory对象… 但是SpringBoot项目,不管是Mybatis还是Mybatis-plus,只要加了相关的起步依赖,就会进行自动装配,we只需要在yml中配置数据源的信息; ------ 简化xml开发,核心就是自动装配 【SpirngBoot定义了一套规范,SpringBoot启动时会扫描外部引用jar包的
SpringBoot使用SpringBoot是在Spring的基础上构建起来的项目,最主要的就是自动配置【starter】、独立运行【内置Tomcat】、智能,配置的默认值会根据依赖项的改变自动改变,使用Spirng Boot可以轻松快速构建一个企业级的应用【SpringBoot最主要的就是内嵌服务器,自动配置】 SpringBoot项目创建 CLI这里最基本的两种方式,基于Spring Initializr初始化和基于maven创建之后手动加入starter 就不再介绍了,因为使用的比较多,并且本人不是很喜欢【slow】 所以这里再介绍一种CLI的方式,类似于之前的Vue-cli命令行的方式
验证是否配置成功,这里按理来说就是bin的路径即可,没有成功可能还没有响应,重试一次即可
默认就是在当前目录下创建项目,所以这里博主就直接跳转target文件夹下面执行init命令 这样子创建确实要快一些,之前等IDEAresolving等的着急,创建成功之后在IDEA中导入项目就可以进行操作 这里解释一下几个.文件【以前解释过简单】
HELP.md就一个markdown文件,参考文档,相关的信息写在其中,方便使用嘛 创建的项目还是按照三成架构为好:其中接触这么多,同一层可以有不同的名称: 控制器层:web/controller; 业务层:service 实体层:domain/entity 主启动类BootApplication是需要放在root下面的,也就是和service/controller等包平级的,因为主启动类的@SpringBootApplicaiton注解中的@ComponentScan默认扫描的是启动类所在的包及其子包
构建一个单体项目 【 mustache模板引擎,JPA】对于这种同等级的工具的使用还没有对比过,mustcache作为Vue的重要支撑,是比freemaker更加轻量级的模板引擎【将数据转为view】 mustache模板引擎这个模板引擎是一个轻量级的非常容易上手的模板引擎,主要就是{{}}就可以了【这里demo不想前后端分离】
html转义显示 {{&}},渲染的时候Mustcache.render(template,data) 同时又封装复用的概念
这就是vue的模板的子模版的概念 这里为了方便进行mustache文件的编写,最好在IDEA中安装handler/mustache插件,插件安装可能出现 idea下载插件一直加载不出来
project demo这里使用CLI的方式创建一个Demo项目 spring init -dweb,mustache,jpa,h2,devtools -p maven cfeng-blog 创建之后就可以看到POM文件的结构如下 其中spring-boot-starter-tomcat是为了方便在外部项目,不使用内嵌的Tomcat【web.xml??—config方式】,同时没有直接导入Junit单元测试依赖,而是直接使用spring-boot-starter-test进行一体化测试【spring的思想DDP测试驱动开发】
这里准备创建一个基于mustache的demo,这里不使用mysql,直接使用h2嵌入式数据库【免费】主要是轻量级的,够快,够方便 SpringBootServletInitializer 【SPI技术】项目中除了常用的主启动类之外,还同级建立了一个XXXServletInitializer继承这个SpringBootServletInitializer,而这个Servlet初始化器又是实现的
各位如果觉得不好理解,就简单将其当作web.xml; 因为SpringBoot时代是使用JavaCofig代替xml配置文件,这里的ServletInitializer就是官方提供的,通过SPI机制【server provide interface】实现的
自定义初始化类重写了configure【主要目的是为了打包在外部的服务器运行】
这里重写的方法借助的是一个关键类
可以观察其属性,比如第一个就是应用程序,后面就是上下文环境,环境等 使用其source方法就可以加载Application,进行war打包部署工作 @SpringBootTest 功能测试集成测试的粒度为多个模块,关注的是多个模块协同工作下的工作结果,不同于之前的简单的单元测试关注单独的一个方法或者模块 Spring Test是整合了其他的比如Junit框架的,所以不必要只是引入Junit框架,Spirng Boot Test在Spring Test的基础上进行了增强,增加了切片测试和mock能力 integration一体化
依赖项就是starter-test【Junit,Spring Test,AssertJ,Hamcret,JSONassert,JsonPath等】 一般情况下,使用@SpringBootTest后,Spring会加载所有被管理的Bean,所以基本等同于启动了整个服务, 其参数可以指定web的运行环境 classes指定的是运行的application启动类
TestRestTemplate 集成测试,模拟HTTP请求 ResponsEntityTestRestTemplate和RestTemplate类似,专门使用在测试中使用,用于和HTTP API交互,TestRestTemplate是对RestTemplate的封装
关于对TestRestTemplate的基本使用,还需要引入几个类进行辅助
所以这几个类配合,就可以进行简单的集成测试,比如我们测试controller的响应结果是否为200
这里将其打印就是处理器响应的html页面,String类型; 这里就集成测试了模板、控制器协同工作的结果,assertThat的断言都是成功的 但是有时候需要在给定类之前或者之后执行一个方法,此时需要使用注解==@BeforeAll和@AfterAll==, 这个就类似于之前的切面的方法前面和后面切入 但是需要注意的是: 这两个注解默认是只能修饰静态方法的,不能修饰常规方法,想要修饰常规的方法,就需要编写单独的properties配置文件 junit-platform.properties 测试平台
配置之后就可以使用After和Before的注解
这里就可以像之前的AOP类似,会在执行任何方法之前或者之后插入our切面, 这里注意版本的配合问题,本人使用@AfterAll和@BeforeAll不生效, 但是看到关于版本的问题,便使用org.junit.jupiter.api.*; 下面的 创建工具类CommonUtil这个demo,我们需要自己封装一些工具方法,还是不要依赖hutool,先封装两个工具类
这里的格式化看着挺复杂,但是是因为要考虑各种情况,比如slug格式化,就要考虑换行,非识别字符等情况,而日期格式化,我们要先建立一个天数映射表daysLookup 🕋明天继续 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 18:41:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |