原创笔记
SpringBoot发展历史:
2002年,当时正是Java EE和EJB⼤⾏其道的时候,很多知名公司都是采⽤此技术⽅案进⾏项⽬开发。这时候有⼀个美国的⼩伙⼦认为 EJB太过臃肿,并不是所有的项⽬都需要使⽤ EJB 这种⼤型框架,应该会有⼀种更好的⽅案来解决这个问题。1、Spring1.x 时代
在Spring1.x时代,都是通过xml⽂件配置bean,随着项⽬的不断扩⼤,需要将xml配置分放到不同的配置⽂件中,需要频繁的在java类和xml配置⽂件中切换。2、Spring2.x时代
随着JDK 1.5带来的注解⽀持,Spring2.x可以使⽤注解对Bean进⾏申明和注⼊(spring2.5),⼤⼤的减少了xml配置⽂件,同时也⼤⼤简化了项⽬的开发。那么,问题来了,究竟是应该使⽤xml还是注解呢?我们最终选择的是应⽤的基本配置(如数据库配置)使⽤xml,业务的配置⽤注解。
3、Spring3.x到Spring4.x
从Spring3.x开始提供了Java配置⽅式,使⽤Java配置⽅式可以更好的理解你配置的Bean,并且Spring4.x和Spring boot都推荐使⽤java配置的⽅式。
Pivotal 公司成⽴之后,于 2014 年发布了 Spring Boot,2015 年发布了 Spring Cloud,2018 年 Pivotal 公司在纽约上市。
springboot 简介:
Spring Boot 是由 Pivotal 团队提供的全新框架。Spring Boot 是所有基于 Spring Framework 5.0 开发的项⽬的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应⽤程序并且尽可能减少你的配置⽂件。设计⽬的:⽤来简化新 Spring 应⽤的初始搭建以及开发过程。
从最根本上来讲,Spring Boot 就是⼀些库的集合,它能够被任意项⽬的构建系统所使⽤。它使⽤ “习惯优于配置” (项⽬中存在⼤量的配置,此外还内置⼀个习惯性的配置)的理念让你的项⽬快速运⾏起来。⽤⼤佬的话来理解,就是 spring boot 其实不是什么新的框架,它默认配置了很多框架的使⽤⽅式,就像 maven 整合了所有的 jar 包,spring boot 整合了所有的框架
版本说明:项⽬创建:
⼀般都是创建⼀个空格project,⾥⾯创建spring-initer模块snapshot 开发版,不稳定
后边不带snapshot是稳定版,也就是默认带RELEASEmvnw maven
mvnw.cmd 这两个都是命令的⽂件,国内基本⽤不上
配置读取:
@ConfigurationProperties(prefix=\"\")注解必须要添加前缀,也就是没有前缀⽆法读取需要成员变量名称和配置⽂件去掉前缀的名称⼀致
没有set⽅法的字段不会读⼊配置参数1.在类上⾯添加注解
会⾃动读取配置,通过set⽅法注⼊到类的成员变量⾥⾯2.可以标注在⽅法上⾯
这样会直接通过set⽅法,注⼊到返回对象的参数⾥⾯
@Value(\"${xx}\")指定具体读取哪个配置参数给下⾯的成员变量(要写全称)
可以读取没有set⽅法的字段上⾯两个注解可以结合@PropertySource(\"位置:⽂件名\") 读取其他properties⽂件(注意:这个注解不能读取yaml⽂件......)
@PropertySource(\"classpath:nima.properties\")
不写@PropertySource默认读取application.yml/properties配置⽂件
神器:
1.创建启动类和配置⽂件, JBLSpringAppGen ⼀定要下载哦这个东西是陷阱,妈的下载不了2.JRebel 热部署插件3.JSON-handle chrome插件4.mybatisx idea插件
⾃动化配置
项⽬由⽗依赖控制版本,⽗依赖包含了绝⼤部分坐标.⽗依赖⼜继承于dependency,这⾥⾯放了⽆数的坐标信息springboot使⽤了全新的⼀套starter体系,不同于传统的maven依赖
我们需要使⽤什么组件时,直接导⼊启动器坐标,不需要写版本,就是从⽗依赖取出.⼀定要导⼊start-web,不然没有启动器,boot运⾏后直接结束设置banner
在resource下⾯新建⼀个banner.txt,放⼊想要的banner
单元测试
需要导⼊starter-test
@Runwith(SpringRunner.class) //SpringRunner和SpringRunner4JUnit⼀模⼀样的,好像可以不使⽤这个注解了@springbootTest
springboot的测试类上⾯必须添加这两个注解注意必须导⼊import org.junit.Test;不要导错包⼀般只需要测试controller层和service层
service层⽐较简单,直接注⼊service,测试⽅法就可以了controller层使⽤单元测试⽐较复杂,需要⽤mockmvc模拟
重要注解:
⼤致的注解和mvc相同
@springBootApplication 启动类上⾯添加,启动类必须放在包的最外⾯
@RestController 集成了controller,⾥⾯所有的⽅法都返回json的字符串,所以内部⽅法不需要@ResponseBody@Controller 如果还需要返回视图,那么就需要⽤这个注解,后⾯需要带上@ResponseBody@GetMapping,PostMapping 这个注解还可以接收多个映射地址@RequestBody在参数前⾯,表⽰收到的参数都是请求体内容加不加这个注解影响很⼤
ajax的post请求和axios的post请求携带的参数默认在body⾥
ajax和axios的请求头内容需要⾃⼰进⾏拼接的,直接写在参数⾥⾯的默认为请求体就是postman⾥⾯的body
不加这个参数携带的内容都是请求头⾥⾯的,会在地址栏出现
⾃动化配置原理:
@springBootApplication注解组合了
@springbootconfiguration,@enableautoconfiguration(⾃动读取META-INF/spring.factories的配置类)
yml:
yml是boot推荐的,⽐起properties,功能更加强⼤,⽽且不会乱码,可以进⾏格式检验这是⼀种⾮标记语⾔,通过 冒号,缩进等组织数据,格式⽐较严格
与properties除了展⽰形式不同以外,其他功能⼀模⼀样,读取⽅式也不需要改变语法:
1.树状层级结构,如果有关系,下⼀⾏开始空两格2.值前⾯,冒号后⾯⼀定要有空格3.数组与对象的表⽰
-# 数组形式还可以写成namelist: [zhang, li,wang]
# 对象形式还可以写成 user: {name: zhangsan,age: 12}
空格没有强制的数量,只要对齐,就属于同⼀级别.⼤⼩写敏感,松散表⽰
⼀定要⽤空格键,⽽不是tab
注意,⾥⾯的并列⼀定要⽤分号; 隔开, ⽽不是逗号
application.yml导⼊其他yml,application-xx.yml
这⾥的profiles就是指不同的⽣产环境,因此也可以⽤来设置不同的环境开发环境:application-dev测试环境:application-test准⽣产环境:
⽣产环境:application-prodspring:profiles:active:xx,xx
全局异常处理
springmvc⾥⾯实现HandlerExceptionResolver接⼝
boot⾥⾯也是使⽤相同的思路,也是定义⼀个全局异常处理类⽤@ControllerAdvice标注为切⾯类(组合了@component)
⽤@ExceptionHandler(value = Exception.class)( 标注接收的异常类型)
这⾥⾯的⽅法也是返回modelandview对象,所以如果不是返回视图的话,需要⽤@ResponseBody同样的操作,可以在上⾯标注@RestControllerAdvice,后⾯⽅法上不需要添加@ResponseBody被全局异常捕获以后,console就不会报错信息了推荐定义⼀个状态码,或者依据公司的定义,不要乱写我也觉得应该使⽤阿⾥状态码
有⼀个规范以后,就可以通过enum定义状态⼩⼩例⼦:
public enum BizCodeEnum{
UNKOW_EXCEPTION(10000, \"其他错误\"), VALID_EXCEPTION(10001, \"参数错误\"); public Integer getCode() {
return code; }
public String getMessage() {
return message; }
private BizCodeEnum(int code, String message) {
this.code=code;
this.message=message; }
private final Integer code; private final String message; }
1.第⼀种写法,超级重要
@ExceptionHandler(value = Exception.class) @ResponseBody
public Map e.printStackTrace(); //打印⽇志信息 ,超级重要 Map map.put(\"msg\系统异常请重试\"); if(e instanceof ParamsException) { ParamsException paramsException= (ParamsException) e; map.put(\"code\ map.put(\"msg\ } else if (e instanceof BindException) { BindException bindException = (BindException) e; map.put(\"code\ map.put(\"msg\ } return map; } 如果请求出错, 默认访问/error接⼝ springboot给我们提供了error接⼝的处理⽅法 2.或者继承ErrorController接⼝,这种写法不会抛出异常信息了,谨慎使⽤ @Controller public class MyErrorController implements ErrorController{ @Override public String getErrorPath() { return null; }} //然后编写error处理接⼝@RequestMapping(\"/error\") public Map Map 普世修改⽅法 ⾮常重要 autoconfig包下META_INF⾥⾯的spring.fatories⽂件定义了许多⾃动配置了每次添加组件,都会进⾏⾃动配置 找到autoconfig包下⾯⾃⼰需要修改的组件 在下⾯的properties⾥⾯找到对应的标识符 xx.xx.xx然后在applicaton.properties下⾯根据标识符修改或者直接在yml⾥⾯点击进去,也能进⼊xx.properties⽂件 整合⽇志 默认的⽇志系统是logback,已经在web⾥⾯包含,所以不需要额外引⼊⼀般也不修改配置,会使输出的⽇志失去颜⾊,变得很丑只需要注意⼀下⽇志的输出⽅法: ``` Logger l=LoggerFactory.getLogger(启动类.class);l.info/error/debug(\"msg\");``` 注意导包问题,LoggerFactory和Logger都是slf4j从包⾥⾯的 整合mvc: 修改tomcat默认端⼝ 在web下⾯的serverProperties所以修改为server.port=80修改项⽬路径 server.servlet.conetext-path=/nameserver: port: 80 servlet: context-path: /name 静态资源: 指这些资源可以被浏览器直接访问到 resources下⾯可以有四种类型的⽂件夹,会被boot⾃动识别static,public,resources ⼀般把(js,css,html,img)等静态资源放在static⽬录下⾯,浏览器访问时不需要添加/static前缀也可以通过配置修改静态⽬录 spring: web: resources: static-locations: /momo/ 模板引擎(thymeleaf在templates下⾯会被视图解析器⾃动识别,但是不能直接被浏览器访问,需要配置静态⽬录)如果不配置视图解析,则需要写⽂件全称,不能省略.html例: @GetMapping(\"addPage\") public String addPage() { return \"/view/add.html\"; } 视图解析: spring: mvc: view: prefix: /view/ suffix: .html @GetMapping(\"addPage\") public String addPage() { return \"add\"; } 注意:直接访问的页⾯和经过视图转发得到的页⾯他们的请求头是不⼀样的转发 : 1.编写⾃⼰的MyInterceptor ,实现HandlerInterceptor接⼝(同mvc) public class AuthInterceptor implements HandlerInterceptor{ @Autowired private HttpSession session; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; List throw new NoLoginException(); } RequirePermission per = handlerMethod.getMethod().getDeclaredAnnotation(RequirePermission.class); if (per!=null&&!permission.contains(per.code())) { throw new NoLoginException(); } return true; }} 2.编写配置类WebmvcConf 实现WebmvcConfigurer接⼝ //1.使⽤@configuation标志为配置类@Configuration public class InterceptorConfig implements WebMvcConfigurer{ // 2.注册 @Autowired GlobalHandleInterceptor interceptor; @Bean public NoLoginInterceptor noLoginInterceptor() { return new NoLoginInterceptor(); } @Bean public AuthInterceptor authInterceptor() { return new AuthInterceptor(); } //3.添加⾄链 @Override public void addInterceptors(InterceptorRegistry registry) { //pwvi registry.addInterceptor(interceptor).addPathPatterns(\"/**\"); // registry.addInterceptor(authInterceptor()).addPathPatterns(\"/**\").excludePathPatterns(\"/index\ registry.addInterceptor(noLoginInterceptor()).addPathPatterns(\"/**\") .excludePathPatterns(\"/index\ , \"/lib/**\"); }} 跨域处理: 和上⾯类似,不过已经被官⽅写好了,我们只需要注册就⾏了 @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(\"/**\") .allowedOrigins(\"*\") .allowCredentials(true) .allowedMethods(\"GET\ .maxAge(3600); }} 整合连接池: 1. 添加druid坐标,mysql-connector坐标 2. 配置 : 通过spring配置的话,会⾃动注⼊容器,我们就不需要⾃⼰注⼊了 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8 username: root password: happycode0125 或者使⽤springboot官⽅推荐的连接池hikari(默认),就不需要设置typehikari在速度上⽐druid快 mysql-connector8以上,数据库配置时差问题,需要设置上海时间或者北京时间⼀定要设置unicode编码,不然数据库内中⽂就会变成? spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8 username: root password: happycode0125 整合mybatis: 需要先整合连接池 数据库字段⼀般使⽤下划线命名法,这⾥参考⼀下阿⾥建表规约mybatis不能⾃动创建表,需要借助hibernate 1. 添加坐标,这个组件是由mybaits出的,所以不⼀样mybatis-spring-boot-starter2. 配置(实体类包名(以后就只需要类名),⽇志记录) mybatis: type-aliases-package: cn.momoshenchi.demo.pojo mapper-locations: classpath:/mappers/*.xml # 设置了xml映射⽂件位置 configuration: map-underscore-to-camel-case: true # 设置下划线转驼峰logging: level: cn: momoshenchi: demo: dao: debug #使⽤spring boot调试好的语句输出sql语句,格式⼗分美观#通过logging可以定义各种⽇志 3. 编写xml⽂件,模板如下(mybatis的Mapper⽂件也能写成注解的形式) 4. 接⼝层的编写如下 增删改⽅法都返回int(受影响的⾏数) List Integer updateByPrimaryKey(CusDevPlan cusDevPlan); Integer deleteByPrimaryKey(ID id) throws DataAccessException; 5. 事务提交(和spring⾥⾯相同) 在需要的service⽅法上⾯添加@Transaction(propagation =Propagation.REQUIRED)REQUIRED⽀持当前事务,如果当前没有事务,就新建⼀个事务.这是最常见的选择. 6. 然后⼀般在启动器类上⾯添加mapper⽂件夹扫描(@MapperScan(dao中mapper接⼝层的全包名)) 基本操作: 增删改查 分页 每个操作时都要判断⼀下是否操作成功⼀般parameterType都不需要写 select操作 resultType必须写,如果没有实体,也可以通过resultmap可以设置⾃定义返回对象(以及名字不相同的映射)增改时(service层)(也可以把⼀部分校验放在pojo⾥⾯,另外⼀部分需要查询数据库的放在service⾥⾯) 1.参数检验(⽤户名⾮空,是否已经存在) 使⽤commons-lang⼯具类判断,⾃⼰也写⼀个⼯具类判断(会抛出异常)修改操作时(有唯⼀值),要判断是否为⾃⼰本⾝ ⽐如:我要改name,如果name是⾃⼰本⾝,可以修改其他信息.如果name是别⼈已存在,那就不能修改 //⼀般字符串使⽤StringUtil.isBlank判断⾮空// 对象使⽤ ==null 判断⾮空 唯⼀性判断(⽐较⿇烦) insert时只需要判断是否存在⼀样的update需要判断⼀样的是不是⾃⼰本⾝2.设置默认值(创建⽇期,is_valid等等字段)3.判断操作是否成功 删除时⼀般也是假删,不然为什么能够找回啊 ⼀般都是设置⼀个状态,然后修改状态(都是update操作) 分页: 使⽤分页插件,然后⾃⼰封装⼀个xxQuery ⾥⾯有第⼏页,每页数量,查询参数⾃⼰写 (第⼏页-1)*记录数,记录数 service(把查询好的list传进去,就完成了) 其实底层就是使⽤数据库的limit关键字进⾏分页查询注意:如果要使⽤分页插件,⾃⼰的sql语句后⾯不能加分号PageHelper.startPage(第⼏页,每页条数); PageHelper.startPage(第⼏页,每页条数); //查询操作(⾃⼰写sql语句不需要考虑分页,分页插件会修改你的语句,⾃动在后⾯添加limit)PageInfo map.put(\"totalItem\ map.put(\"currentPage\ map.put(\"size\ return map; 直接返回pageInfo对象包含了许多属性,可能有很多我们不需要 mybatis标签: 代替了where关键字,⾥⾯可以跟⾥⾯放置sql语句⽚段,可以通过引⼊可以设置返回的数据类型只有主键可以写id其余字段使⽤column 就是sql⾥⾯的set,不过会去掉末尾的,可以拼接sql语句 concat('','') 也是拼接sql语句,不过是sql函数now()数据校验: service层这⾥的参数检验,也可以由valid模块检验jsr 303:是⼀项标准,提供了⼀些规范 spring mvc⾥⾯添加了⾃动校验的模块,是对jsr303的实现1.⾸先需要导⼊starter-validation 2.在bean上⾯加上校验的注解(见下⾯的常⽤注解),使⽤message输出不符合的信息例如: @Valid只是⼀个规范,⾥⾯啥也没有 ⽽@Validated ⾥⾯有⼀个class[]数组 3.在controller接⼝⽅法的形参上⾯添加@Valid或者@Validated 其后可以添加BindingResult 参数来接收返回信息,但是很⿇烦,⼀般使⽤全局异常处理数据校验必须和全局异常⼀起使⽤ 4.不符合校验后,会抛出BindException(注意bindException不要导包错误). 使⽤bindException.getBindingResult().getFieldError().getDefaultMessage()获取设置的message超级常⽤的写法 if (e instanceof BindException) { BindException bindException = (BindException) e; map.put(\"code\ map.put(\"msg\ }分组: 新增和修改可能需要使⽤不同的校验⽅法,所以我们可以使⽤分组校验适合多场景的校验 可以通过groups指定什么情况使⽤什么校验⽅式groups是⼀个class[],可以设置标志性接⼝来定义此时必须使⽤@Validated 如果@Validated指定了分组,那么所有的pojo字段都必须添加分组,没有分组就不会起作⽤ 如果@Validated没有携带分组信息,就可以校验pojo字段也没有携带的 常⽤注解: 字符串: @NotNull 不能为null,但是可以为空@NotEmpty 不能为null,trim后可以为\"\"@NotBlank 不能为null,trim后也不能是\"\"@Length 字符串的长度必须在指定范围内@Email @URL hibernate提供的 ,也需要添加⾮空判断@Pattern 正则表达式校验,只能⽤于String 数字: @min,@max数组 @Size 集合,数组,map的size必须在指定范围内 ⾃定义校验: 适合及其复杂的校验通过⾃定义注解来实现 然后指定校验器@Constraint(validatedBy) 实现ConstraintValidator<>⽰例: 整合spring data jpa: 1.导⼊依赖 2.配置 基本的数据库连接池,配置jpaddl-auto: create:每次运⾏程序时,都会重新创建表,故⽽数据会丢失 create-drop:每次运⾏程序时会先创建表结构,然后待程序结束时清空表 upadte:每次运⾏程序,没有表时会创建表,如果对象发⽣改变会更新表结构,原有数据不会清空,只会更新(推荐使⽤)validate:运⾏程序会校验数据与数据库的字段类型是否相同,字段不同会报错none: 禁⽤DDL处理 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://47.98.50.20:3306/test?serverTimezone=Asia/Shanghai username: root password: Woai?520xunuo jpa: database: MySQL database-platform: org.hibernate.dialect.MySQL5InnoDBDialect show-sql: true hibernate: ddl-auto: update 3.使⽤注解: @Entity( name= \"xx\")如果数据库名称不是pojo名称,可以进⾏指定@Id 注解表明该属性字段是⼀个主键,该属性必须具备,不可缺少。@GeneratedValue(strategy = GenerationType.IDENTITY)主键⽣成策略: JPA⾃带的⼏种主键⽣成策略 TABLE: 使⽤⼀个特定的数据库表格来保存主键 SEQUENCE: 根据底层数据库的序列来⽣成主键,条件是数据库⽀持序列。这个值要与generator⼀起使⽤,generator 指定⽣成主键使⽤的⽣成器(可能是orcale中⾃⼰编写的序列) IDENTITY: 主键由数据库⾃动⽣成(主要是⽀持⾃动增长的数据库,如mysql)AUTO: 主键由程序控制,也是GenerationType的默认值@Column () 设置数据库字段 @Query ⾃定义查询操作(可以select/update) dao层继承JpaRepository save() // 实现了insert和update,会⾃动根据数据判断增删改DAO: 如果jpa提供的基本增删改查不满⾜需要,可以⾃⼰添加sql语句(操作jpa的核⼼)位置绑定: @Query 注解的使⽤⾮常简单,只需在声明的⽅法上⾯标注该注解,同时提供⼀个 JPQL 查询语句即可 @Query(\"select u from User u where u.email = ?1\")User getByEmail(String eamil); @Query(\"select u from User u where u.username = ?1 and u.password = ?2\")User getByUsernameAndPassword(String username, String password);@Query(\"select u from User u where u.username like %?1%\")List 参数绑定: 默认情况下,Spring Data JPA使⽤基于位置的参数绑定,如前⾯所有⽰例中所述。 这使得查询⽅法在重构参数位置时容易出错。 要解决此问题,可以使⽤@Param注解为⽅法参数指定具体名称并在查询中绑定名称,如以下⽰例所⽰: @Query(\"select u from User u where u.id = :id\")User getById(@Param(\"id\") String userId); @Query(\"select u from User u where u.username = :username or u.email = :email\") User getByUsernameOrEmail(@Param(\"username\") String username, @Param(\"email\") String email); 分页: //dao正常使⽤,只是多加了⼀个 Pageable 参数⽽已 @Query(\"select t from Teacher t where t.subject = :subject\") Page service层 使⽤pageRequest组装page参数 PageRequest request = PageRequest.of(page-1,size); Page //使⽤getTotalElements获取总共数据 Map map.put(\"data\ map.put(\"totalItem\ map.put(\"currentPage\ map.put(\"size\ 性能优化: 尽量不要使⽤select * ,⽽是列出所有字段使⽤缓存和mq进⾏多数据库联动mybatis-G: 这是⼀个插件,使⽤maven导⼊ 根据数据库表⽣成bean,interface.⼀般数据库表是启动sql脚本⽂件⽣成,⽽脚本⽂件是通过power-designer⽣成的可以将数据库下划线命名法字段改成驼峰命名法的java bean 会⾃动使⽤包装类型代替基本类型,例如:使⽤Integer代替int来创建bean⾥⾯的变量1.导⼊坐标 在plugin⾥⾯添加mybtis-generator,添加generatorConfig配置⽂件位置2.配置 generatorConfig.xml(最核⼼的配置⽂件) 设置数据库连接信息,设置jdbc-connnect位置,设置不⽣成注解(因为注解都是英语的,没有什么⽤)设置pojo,mapper,dao的位置 原来现在使⽤这个的⽐较多,⼤体上配置和mybatis相似,但是使⽤上⾯和hibernate相似也可以⽣成代码 mybatis-plus: type-aliases-package: cn.momoshenchi.demo.pojo mapper-locations: classpath:/mappers/*.xml # 设置了xml映射⽂件位置 configuration: map-underscore-to-camel-case: true # 设置下划线转驼峰 global-config: db-config: id-type: auto 但是字段类似于jpa,没搞懂为什么要加注解..不会是写好基本增删改查的那种吧..通⽤mapper: 通⽤mapper,也不是springboot官⽅推出的导⼊坐标 mapper-spring-boot-starter, ⼤致使⽤和room是相似的(在实体类上⾯标注table ,id,keysql,) 但是不需要在mapper上⾯标注可以直接在service⾥⾯使⽤ 最后也要在启动器上⾯添加mapper扫描(写法⼀样,但是包名不⼀样,⼀定要注意) 整合redis 简单⽰例,具体见redis⽂档1. 添加坐标 spring data redis 2. 配置 本地环境可以不配置 spring: redis: host: localhost port: 6379 测试时需要开启本地的服务端 @Autowired private RedisTemplate redisTemplate; //这是springboot集成redis的操作对象 java的redis客户端Jedis已经被抛弃了 使⽤redisTemplate.opsForValue/Hash/List就可以进⾏相应的操作⽰例 打包 pom.xml⾥⾯放置了boot的打包组件,导⼊后,maven图标lifecycle中双击package会在target下⾯打出⼀个jar包(可以通过skip来跳过测试模块)(我这⾥这个打包插件怎么⽼是报错) jab默认会以application.yml⾥⾯的配置为准 可以在命令⾏中通过 java -jar 带地址的项⽬名字.jar 来使⽤项⽬war包有点⿇烦,⽽且使⽤不多需要在pom.xml⾥⾯配置1.<> 2.<> 忽略内置tomcat3.设置包名 4.重写config⽅法 war包需要放在外部tomcat中webapp⽬录下,⽽且配置都是默认的tomcat配置 swagger3 ⽂档⼯具 前后端分离项⽬⾮常好⽤的⼯具,减轻后端维护的困难使⽤swagger后,⽅法上⾯的注释也就不需要了swagger3⽀持 OpenAPI,就是⼀套⽬前的api规范1. 导包 2. 配置写⼀个配置类(使⽤@configation,@EnableOpenapi)但是在正常情况下,实际上不需要添加 @EnableOpenApi 注解。设置扫描的api接⼝包名⽂档名称以及版本3. 使⽤ 在接⼝⽅法上⾯标注功能,以及参数解释具体使⽤有⼀套规范,不能更改(只需要添加@Operation) 如果带有@RequesBody,接收json格式,那么就不会有parameter(地址栏参数),⽽是以schema为代替返回类型不能是map,list等等,必须封装⼀下.不然就不能看到返回值类型(因为没有查询,map⾥⾯是空的)接⼝类上⾯使⽤@Api标注 每个接⼝的说明ApiOperaion必须要有pojo类不处理 也就是说,只需要给每个接⼝⽅法描述⼀下,其他参数说明等等都不需要 swagger3使⽤项⽬路径+swagger-ui/index.html 访问注解: 这些注解都是swagger2⾥⾯的注解,swagger3已经更新了@Api(tags=\"\")⽤在类上⾯,说明类的作⽤ @ApiOperation(value=\"⽅法作⽤说明\备注说明\") ⽤在⽅法上⾯,必填的(前端⼤部分时候需要知道每个⽅法的作⽤)@ApiimplicitParams(name=\"参数名\参数的解释\⼀般只写三个参数(paramtype=\"⽅法获取类型[header@RequestHeader地址栏/path@pathVariable/body/form表单] \")@ApiResponses 写在⽅法上⾯ @ApiModel (value=\"\") 放在响应类上⾯(⼀般是实体类)@ApiModelProperty (value=\"\") 在实体类的字段上⾯ swagger3注解: @Operation代替上⾯的@ApiOperation (summary=\"⽅法上⾯的描述\点开的具体描述(可以说明⼀下参数,以及响应信息)\") ⼯具类推荐 commons-lang3 热部署 好像找到了以往代码的龟速开发惨痛史 热部署就是运⾏的时候可以更新代码,简直是学⽣党福⾳啊 原理上是使⽤了两个classLoader,⼀个加载那些第三⽅jar包,⼀个加载更改的类.类更改后,会重新创建⼀个classLoader,代替旧的 由于需要加载的类⽐较少,所以实现了较快的重启时间注意: 重启会清空项⽬session中的值,以及缓存中的值 需要修改idea的⼀些配置,开启⾃动编译,⽆论任何热部署⽅法都需要(⾃动编译,运⾏时编译)JRebel or devtools 如果jRebel不收费,那绝对使⽤jRebel的 作为热部署界的前辈,JRebel依然是敌得过后浪,果然是姜还是⽼的辣使⽤devtools需要引⼊依赖,设置yml配置(所以每个项⽬都需要配置)JRebel只需要下载插件,然后功能栏上⾯就会多两个按钮激活:上⾯填的这个到底是什么东西,为什么是⽹站加上GUID使⽤: 原来就是build⾥⾯ ctrl+f9更新编译整个项⽬ctrl+shift+f9更新当前⽂件 分布式缓存Ehcache Ehcache是⼀个⽐较成熟的缓存框架,最早由hibernate发展⽽来.与后⾯的redis⽐较类似,都是有策略的缓存⼀部分数据也是key-value型的⾮关系型数据库可以放在jvm内存或者本地磁盘1. 导⼊坐标 注解: @CacheConfig(cachename=\"\") 放在类上⾯@Cacheable 放在读取数据的⽅法上⾯,设置可缓存的⽅法 下次查询时,从缓存中读取.如果缓存中没有,从数据库中查询并放在缓存中value 集合名 key =\"#id\" 注意:key⾥⾯⾸先带⼀个#@CachePut (value ,key) 放在新增,更新数据的⽅法上⾯ 调⽤⽅法后会⾃动把返回的类型放⼊缓存,与数据库同步@CacheEvict (value ,key) 放在删除⽅法上,数据⾃动从缓存移除2. 配置⽂件 ehcache.xml(⽐较繁琐,复制就好了)yml中配置xml地址 3. 使⽤ 启动类上⾯添加@EnableCaching ,pojo实现序列化在相应的⽅法上⾯添加对应的注解 如果数据已经有了,缓存会不会执⾏service操作,应该不会注意:最好把缓存放在service层 这⾥⾯查询,增加,修改⽅法必须返回数据,⽽且数据类型必须⼀致.(不能返回void,否则不会放⼊内存)删除⽅法可以返回void ⼀般这⾥⾯的key取不变的值,⽐如userid之类 集成Thymeleaf freemarker,thymeleaf都是前端模板引擎,jsp也是模板引擎不过早就过时了thymeleaf基于html,这是boot官⽅推荐的前端模板引擎使⽤⽐较简单,开箱即⽤(⼀般只需要配置不使⽤缓存就⾏了) 默认后缀.html 使⽤th: xx =\"${}\"属性读取数据 接⼝写法 ⼀般最外层都是状态码和描述说明 这⾥ 使⽤commons-lang⼯具类判断,⾃⼰也写⼀个⼯具类判断今天⼜看到了linux客户端,ssh,xshell⼜想到了阿⾥云等云端 quartz 定时器 功能⽐起js⾥⾯的计时器要强很多,因为有cron表达式java⾥⾯还有⾃带的Timer, boot⾃带的Scheduled等等定时器1. 导包 starter-quartz2. 使⽤ 1. 定义job,实现Job接⼝(要执⾏的任务)在execute⾥⾯实现业务逻辑 2.定义调度配置类(使⽤@Configuration)创建JobDetail实例(使⽤前⾯的job), 使⽤scheduleBuilder(计划构建器)和detail实例 定义Trigger(触发器) 启动服务后,定时任务就会⼀直进⾏ 可以到⽹上查找cron表达式,直接复制到cronSchedule⾥⾯就⾏了 cron是linux中的计时任务,在java中也使⽤cron表达式.秒 分钟 ⼩时 ⽇ ⽉ 星期 年
因篇幅问题不能全部显示,请点此查看更多更全内容双击maven⾥⾯的mybatis-generatormybatis-p: