技术在历史年轮里前进,大android的时代已经过去,市场趋于稳定,基本混合开发,也就是原生开发和前端开发混合的app.公司也在不断的发展,到最后日常开发变成前后台分离,前分前端和移动,前端就是最火的大前端,移动基本是android开发,IOS国内基本很少,只要用到APP,那就少不了原生开发,问题是只剩下一个壳子,里面到最后都变成前端页面,说到底APP的开发一个方向就是前端开发,后台不用说了,永远的存在,只是net和java都有,慢慢的把net抛弃,最终使用java开发,也就形成最终的开发模式:基于VUE的前端+基于原生的android壳子(java和kotlin)+基于java的大后台.熟悉后台迫在眉睫,以下的只是初级程序员的入门课程
当前开发框架:
Spring+SpringMVC+Mybatis->Springboot+Mybatisplus
**
**
(spring framework(基础框架),spring boot(快速开发),spring cloud(分布式))
基础底层框架,简化开发(IOC,AOP)和整合其他框架(MybatisPlus)
Spring framework(基础系统架构):
第一部分 容器,bean,ioc,注解形式
第二部分 整合mybatis,junit,注解形式
第三部分 AOP操作和开发
第四部分 事务开发
_____________________________________________________________-
第一部分 容器,bean,ioc,注解形式
IOC容器:控制反转
把对象实例化全部交给IOC容器进行管理,解决解耦,这些对象统称为Bean
IOC容器将有依赖关系的对象Bean进行关系绑定,也就是DI(依赖注入)
IOC和DI的步骤:
1.pom中导入spring的坐标spring-context
2,定义spring管理的类,在resources的xml配置bean
bean标签bean
id属性名字
name别名
class类型
spope是否单例
autowire自动装配类型
3,获取IoC容器,并通过容器获取bean
4,删除业务层中使用new的方式创建的dao对象,提供对应的set方法
5,配置server与dao的关系
property标签配置当前bean的属性
name属性配置具体的属性
ref属性表示参照哪一个bean
实例化bean
1,构造方法实例化bean
2,使用静态工厂实例化bean
3,使用实例工厂实例化bean
4,使用FactoryBean实例化bean,实现getobject和getObjectType方法(推荐)
bean生命周期
创建对象->构造方法->set方法->init方法->业务->destroy(实现InitializingBean, DisposableBean接口)
依赖注入(数据传递):
setter注入(推荐):
简单类型(name+value)和引用类型(name+ref)
构造器注入:
简单类型(constructor-arg+value)和引用类型(constructor-arg+ref)
依赖注入的进化-自动装配 autowire=“byType”,(按类型,对引用类型操作,优先级低于setter和构造器)
集合注入(xml配置)
array property(array+value)
list property(list+value)
set property(set+value)
map property(map+entry+value)
properties property(properties+pro+key)
第三方bean管理和注入方式,只能使用框架提供的
容器通过ClassPathXmlApplicationContext获取容器并操作的
注解开发(快速):
配置文件applicationContext.xml改成配置类SpringConfig形式
流程为获取容器,加载配置类,扫描所有bean,步骤如下:
1,AnnotationConfigApplicationContext加载配置类SpringConfig.class
2,配置类SpringConfig.class添加如下注解
@Configuration 配置类标识
@ComponentScan({“com.aile.service”}) 扫描定义bean路径
@PropertySource({“jdbc.properties”}) 加载properties配置文件
@Import({JdbcConfig.class}) 导入其他配置类信息
3.在需要定义的类上添加Component(controller,service,repository)定义bean
一般bean有controller(controller),service(service),repository(Dao)三层
bean注解:
Component bean标识
scope 是否单例
bean生命周期注解
init注解PostConstruct
destrory注解PreDestroy
依赖注入注解:自动装配
Value:注入简单类型(无需提供set方法)
Autowired:注入引用类型,默认按类型装配
第三方bean管理用注解 @Bean
第三方bean依赖注入用注解
1,引用类型用方法形参
2,简单类型用成员变量
配置文件XML改成配置类注解形式:
_____________________________________________________________-
第二部分 整合mybatis,junit,注解形式
spring+mybatis(注解方式)
1,pom中导坐标druid,mybatis,mysql,spring-jdbc,mybatis-spring
2,编写mybatis类,主要方法sqlSessionFactory和MapperScannerConfigurer处理
3,在springconfig导入mybatis文件
spring+junit(注解方式)
1,pom导坐标junit,spring-test
2,注解
@RunWith(SpringJUnit4ClassRunner.class) 设置类运行器
@ContextConfiguration(classes = SpringConfig.class) 设置Spring环境对应的配置类
@Test 测试方法
_____________________________________________________________-
第三部分 AOP操作和开发
概念:
在不惊动原有代码的基础上进行功能添加,无侵入性,本质为代理模式
通知(共性)通过切入点(方法)将代码切入连接点(执行方法)
AOP注解开发
1,导坐标aspectjweaver
2,定义接口和实现类用作连接点
3,定义通知类(Component和Aspect),定义切入点Pointcut,绑定关系Around,
4,配置类开启AOP注解开发EnableAspectJAutoProxy
流程
1,容器启动
2,读取所有切入点
3,初始化bean
4,获取bean执行方法
切入点表达式Pointcut
标准格式:
excecution (public void com.aile.service.BookService.findById(int))
通配符描述拓展
通知类型
前置通知 Before 在原始方法运行之前执行
后置通知 After 在原始方法运行之后执行
(重点)环绕通知 Around 在原始方法运行的前后执行,ProceedingJoinPoint标识位置,并有返回
返回后通知 AfterReturning 在原始方法执行完毕后运行,无异常才会执行
抛出异常后通知 AfterThrowing 在原始方法执行过程中出现异常后运行
实例开发
1,定义通知类(Component和Aspect),定义切入点表达式Pointcut,绑定通知类型Around,
其中环绕通知显示哪个类,哪个方法执行,通过Signature获取类名和方法
2,开启AOP注解开发EnableAspectJAutoProxy
通知获取数据–重点掌握Around
Before,After通过JoinPoint的getArgs获取参数
Around通过ProceedingJoinPoint的getArgs获取参数,并且可以更改参数
AfterReturning通过returning里字段返回
AfterThrowing通过throwing里字段返回
_____________________________________________________________-
第四部分 事务开发
保证数据库操作同成功同失败,比如典型案例,银行转账
步骤
1,在业务接口上添加事务管理Transactional
2,在jdbc事务中配置事务管理器,PlatformTransactionManager,DataSourceTransactionManager
3,开启注解式事务驱动EnableTransactionManagement
事务角色(将多个事务变成一个事务)
管理员 业务层开启事务的方法
协调员 数据层或业务层的方法
事务log问题
log不能同事务同一个事务,设置事务propagation新开事务,给log添加
@Transactional(propagation = Propagation.REQUIRES_NEW)
**
**
属于Spring的一部分,同servlet等同,属于web框架,简化servlet开发,一个controller搞定
内容:
第一,请求和响应(接口)
第二,REST风格
第三,SSM整合
第四,拦截器
步骤:
1,导入坐标spring-webmvc
2,使用Controller定义bean,通过RequestMapping设置访问路径,设置返回类型ResponseBody
3,创建springmvc配置类Configuration,加载controller对应的bean使用ComponentScan,
4,创建web容器配置类AbstractDispatcherServletInitializer,实现三个方法
createServletApplicationContext 加载springmvc配置类,产生springmvc容器
getServletMappings 设置哪些请求由springmvc处理,设置请求路径
createRootApplicationContext 加载spring配置类,产生spring容器,一般不处理
controller加载控制和业务bean加载控制
1,springmvc加载的bean均在controller内–推荐这个
2,spring加载的bean,就要排除controller内的bean,通过ComponentScan设置,有两种方式
2.1,ComponentScan只设置需要扫描的包
2.2,ComponentScan通过excludeFilters来过滤某个包
3,把spring和springmvc加载到一个环境中
_____________________________________________________________-
第一,请求和响应(接口)
请求路径
需要根据功能定义路径,若有相同路径,可把相同的部分放类名上面@RequestMapping(“/book”)
请求参数
普通参数传递,参数对应即可
POJO参数,让传递对象
Json请求,需要导入坐标jackson,配置类添加EnableWebMvc,开启json数据类型自动转换,参数添加RequestBody即可
日期类型参数,@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
响应
一般返回json数据,添加ResponseBody,接口开发只需关注对象即可,jackson会自动把对象转换为json返回给前端
中文编码处理
ServletContainersInitConfig添加CharacterEncodingFilter为UTF-8
_____________________________________________________________-
第二,REST风格
访问网络资源的格式,书写简化,隐藏资源的访问行为(get,post,put,delete)
普通操作和Rest风格对比
基于RestFul风格的页面访问处理
springmvc默认不扫描静态文件,故访问静态页面受阻,那么就需要放行静态页面资源,
通过WebMvcConfigurationSupport,注册相关放行的资源,保证可以正常加载
_____________________________________________________________-
第三,SSM整合
结构
springconfig,jdbcconfig,mybatisconfig,servletconfig, springmvcconfig 配置类
domain 实体类模型
dao 数据层标准开发
service 业务层标准开发(数据库dao操作)
controller 表现层接口开发
test junit业务层测试
SSM整合–Spring+SpringMVC+MyBatis
1,导坐标和配置文件
spring整合mybatis–>springconfig,jdbcconfig,mybatisconfig,jdbc.properties
spring整合springmvc–>web配置类servletconfig,springmvcconfig
2,表,实体类,dao,service,controller
3,业务层service–junit测试
表现层controller(REST风格)–postman测试
4,service添加事务
表现层数据封装–前后端定义的规范
前端要求返回结果能否统一,故需进行数据的封装,返回类放在controller层,结构如下:
操作
1,result封装类
code 返回结果编码
data 数据
msg 提示
2,code类
3,controller所有返回改成result
异常处理器
前端请求接口返回的数据出现异常,不会按照约定格式返回,那就需要把异常抛出去,最后放在表现层
controller进行分类处理,注解为RestControllerAdvice和ExceptionHandler—基于AOP思想的异常处理器
异常处理方案
异常分类:业务异常,系统异常,其他异常
步骤
1,自定义业务和系统异常类
2,定义异常处理器,分别处理三个异常
3,在可能出现异常的地方调用一下
案例–web+controller的调用和页面处理,都是页面逻辑,可忽略
添加数据 弹窗,输入信息,提交成功,关闭弹窗,清空信息,刷新页面
编辑数据 弹窗,显示信息,提交成功,关闭弹窗,清空信息,刷新页面
删除数据 弹窗提示框,确定删除,刷新页面,取消删除
_____________________________________________________________-
第四,拦截器
概念:动态拦截机制,在springmvc的表现层动态拦截控制器方法的执行,可前后指定,可阻止原方法
步骤:
1,创建拦截器类bean,放在controller下,实现HandlerInterceptor接口,
preHandle(可拦截),postHandle,afterCompletion方法
2,定义配置类,实现addInterceptors方法
3,springmvcconfig扫描配置类
可定义多个拦截器,执行顺序按照写的先后顺序,多拦截器日常用的少,基本单拦截器即可
**
**
分模块开发–类似android组件开发
由于某些模块是公共的,大家都可以使用,故多模块开发
依赖管理
依赖有传递性,后面的配置为准
可选依赖 optionnal,对外隐藏当前所依赖的资源 --不透明
排除依赖 exclusions,排除别人的依赖 --不需要
聚合 A,B,C模块都依赖D,那么D更新了,那么A,B,C就需要更新,那么就需要第三个聚合模块
步骤
1,在pom文件中定义packaging为pom类型
2,设置维护的模块,使用modules依次添加上
继承 父子模块,简化配置和减少版本冲突
步骤
1,在子类模块pom中使用parent继承,就会获取父类所有依赖
2,子类A需要父类依赖1,子类B不需要,那么通过dependencyManagement让子类自己选择是否依赖
属性管理–maven依赖版本更新后,可能写错,故通过属性解决
步骤
1,在pom中定义properties属性,并有别名
2,在引用的地方使用别名即可
多环境配置与应用 由于日常后台开发,需要配置不同的环境,比如测试环境,生产环境,开发环境
步骤()
1,在pom中使用profiles和properties配置多环境,
2,手动activeByDefault指定是否是默认环境,当然命令也可以mvn install -P 环境名称
跳过测试
功能还没完成,但是需要打包,故需要跳过这个测试
命令 mvn install -D
私服
把公共模块放入自己公司内部的服务器,使用Nexus用于maven管理通用模块坐标
**
**
概念:
大大简化Spring应用初始搭建以及开发过程,只剩下:
1,pom两个依赖,起步依赖
spring-boot-starter-parent 源码已经导入所有常见依赖坐标
spring-boot-starter-web 源码已经导入spring,springmvc,tomcat依赖
2,SpringBootApplication主程序引导类
简单创建步骤
1,创建模块,选择spring initializr
2,选择spring web
3,编写controller类
项目发布和执行
1,通过maven的package对项目打包
2,通过命令启动项目,java -jar 包名
切换服务器
选择排除依赖不要内置tomcat,可使用其他服务器
基础配置
通过properties,yml,yaml配置端口(port),log类型(logging),多环境(yml中profiles),
优先级为properties,yml,yaml,常用yml格式配置
Yml,重数据轻格式,容易阅读,大小写区分,根据空格区分层级
Yml读取–常见使用第三个方法
1,根据@Value读取
2,根据自动装配Environment读取
3,根据自定义对象封装读取,ConfigurationProperties注解对象bean
多环境启动命令特殊情况下处理事件
java -jar jar包名 --spring.profiles.active=test --server.port=88
多环境有maven pom和springboot yml两种配置方式,最终以maven配置为准
为了解决该问题,因此yml就可以使用pom的配置
配置文件4级–除了命令可以更改参数,但是参数越多,输入越多,因此使用yml扔到file文件里即可
1级, file,config/yml
2级, file,yml
3级,classpath,config/yml
4级,classpath,yml
1和2级用于上线配置文件更改,因为等级最高
3和4级用于开发配置文件
Springboot整合junit
1,SpringBootTest,指定主程序引导类
2,自动装配业务方法,Test里的方法直接调用
基于springboot整合SSM
springbooot整合mybatis,其中spring整合mybatis的springconfig,jdbbconfig,mybatisconfig都不用写了,
其他保留
步骤—添加Mapper
1,创建spingboot工程,spring initializr,选择当前使用的技术,mybatis framework和mysql driver
2,yml文件配置jdbc参数
3,定义数据层接口与映射配置,Dao接口添加注解Mapper
4,测试类测试
结构
controller 表现接口层,用于前端接口请求,并对返回结果合理封装和异常时返回结果处理
dao 数据层,用于数据库的操作
domain 实体类,lombok开发@data
exception 自定义异常类
service 业务层,对数据层的处理
application 主程序入口
application.yml 端口,jdbc等相关配置
static 前端页面
test 对业务层的测试
pom.xml maven坐标的管理
**
**
MybatisPlus 基于Mybatis开发的增强工具,简化开发,提高效率,国人开发的工具,简称MP
步骤
1,创建工程,导入坐标mybatis-plus-boot-starter
2,创建DAO层,添加Mapper,继承BaseMapper,省略了好多开发
特点
无侵入性
强大的CRUD操作,单表操作方便
支持lambda
支持分页
标准数据库开发
insert(obj) 插入
deleteById(id) 删除
updateById(obj) 更改
selectById(id) 查询一条
selectList 查询所有
selectPage 分页查询+分页拦截器配置类
开启mp的日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
DQL控制 条件查询
通过LambdaQueryWrapper进行条件查询,关键词有lt,gt.or,eq,between,like,groupby,count,in,order
null值处理 通过链式编程和非null判定
查询投影 LambdaQueryWrapper和QueryWrapper都可以只看查询的字段
实体类字段和表名字段映射匹配问题
字段对应不上 @TableField(value = “表格字段”)
表名对应不上 @TableName(“表名”)
不查询字段 @TableField(select = false)
不存在字段 @TableField(exist = false)
DML控制 增删改操作
id主键生成策略
自己设置主键生成策略.有8个策略,AUTO,UUID,雪花算法, 比如:@TableId(type = IdType.ASSIGN_ID)
可使用通用配置yml
mybatis-plus:
global-config:
db-config:
id-type: assign_id
多记录删除 deleteBatchIds(list)
逻辑删除 标记删除,但不是真的删除,是为了后续的使用,
1,表添加字段,deleted
2,实体类添加字段,deleted,添加注解@TableLogic(value = “0” ,delval = “1”),一般在yml配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted
logic-not-delete-value: 0
logic-delete-value: 1
乐观锁 并发的问题
1,表添加字段,good
2,实体类添加字段,good,添加注解Version
3,MybatisPlusInterceptor中OptimisticLockerInnerInterceptor添加乐观锁拦截器
MP代码生成器
1,导坐标generator和velocity
2,代码生成器,AutoGenerator.excute
3,配置数据源,全局,包, 策略等配置即可
基于Springboot的SSM框架工程结构