一、错误积累
1. 请求体是json数据时,加上@RequestBody注解,用java对象接收。
2.关于测试类junit ,如果你想用加上@SpringBootTest 注解的测试类,你就必须将它跟 启动类放在同一包下。
但如果你不想用测试类,那么可以随意去放。
3. 一个常识性的知识普及一下,业务层的方法名定义一定要与业务有关,例如登录操作
login(String username,String password);
而数据层的方法名定义一定与业务无关,是一定,不是可能,也不是有可能,例如根据用户名密码查询
selectByUserNameAndPassword(String username,String password);
4.数据校验
5.响应码
后端传递的json数据中的响应码与 http的状态码不一样。
6. 发现一个很6的注解
@RequestHeader 可以直接获得请求头中的对应的value
7.多环境开发
再次往下分:但我感觉意义不大
2.事务回滚
关于错误的捕获,不要跟事务回滚弄混了。
统一错误捕获使用的是
@RestControllerAdvice
@ExceptionHandler
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler
public Result ex(Exception e){
e.printStackTrace();
log.info("捕获异常{}",e.getMessage());
return Result.error("默认异常已被返回到前端");
}
}
3.事务传播行为
事务传播特性的默认值是 Required ,即有则加入,无则新建。
例如:上图的案例。
共用一个事务时(Required)。第①失效时,第②也会失效。日志就不会加到数据库里面。
当不共用一个事务时(required_new),调用②时,会先将当前的事务挂起,并去创建一个新事 务,②这个方法成功执行后,将新事物进行提交,
接着恢复已挂起的事务,即使①发生了异常,也不会影响②的执行。
4.面向切面编程,要想配置一个切面,你得加上@component注解和@Aspect注解,
我记得还要开一个代理,来表示开启自动生成代理对象。但springboot好像不用。
环绕通知的返回值比较特殊。
4.通知类型
记得其他通知没有返回值,但对于加了环绕通知注解的@Around ,是需要返回值的,这个返回值即为目标方法的返回值。
5.通知的执行顺序 (可以使用@order注解)
6.切入点表达式
原来不知道的: ①可以用接口 ② ..可以匹配任意类型的参数
7.另一种切点表达式 的形式:太神奇了
例:
①定义一个接口,作为一个标记
② 在需要增强 的方法上加上 标志性接口
③在切面类上 使用 @annotation(标志性接口)
这样就会对加上 标志性接口的方法 进行 增强
8.自己对ProceedingJointPoint和JointPoint的看法
解决下图的疑问,是根据bean来找实现类的,不会同时出现两个。
9.@Documented注解是什么意思?
二、springboot原理篇
1.配置
2. bean管理
2.1 获取bean
这个其实挺简单的,因为 在看老杜的课时, 他讲了两种获取 applicationContext的方式,一种是根据配置文件,一种是根据配置类。这样就获得了IOC容器。
要想获取IOC容器中的bean,可以看下图 有三种方式。
下图中,使用@SpringBootTest注解 来进行测试。
原来不知道ApplicationContext 可以通过@Autowired注入进去
2.2 bean的作用域
singleton prototype 单例和多例
2.3 第三方bean (@bean)
学习完bean的获取、bean的作用域之后,接下来我们再来学习第三方bean的配置。
之前我们所配置的bean,像controller、service,dao三层体系下编写的类,这些类都是我们在项目当中自己定义的类(自定义类)。当我们要声明这些bean,也非常简单,我们只需要在类上加上@Component以及它的这三个衍生注解(@Controller、@Service、@Repository),就可以来声明这个bean对象了。 但是在我们项目开发当中,还有一种情况就是这个类它不是我们自己编写的,而是我们引入的第三方依赖当中提供的。
(不推荐)解决方案①:在启动类上添加@Bean标识的方法
解决方案②: 单独定义一个配置类
3.springboot原理
3.1 起步依赖
利用Maven依赖传递的特性.
如下图引入
4.自动配置
当在同一个类中既有@SpringBootApplication注解,又有 @ComponentScan注解,那么@ SpringBootApplication 注解里自带的@ComponentScan注解 会被覆盖。
因此对于启动类来说,它也是一个配置类,可以声明第三方bean
三、Maven高级
将子工程的共有的依赖抽取到父工程中
注意是在父工程进行 版本锁定,锁定后并不会引入相关依赖,而是去 约束子工程的版本。
Maven的聚合
私服
四、临时报佛脚篇
1.java项目部署(有坑)
引入打包插件
然后执行package命令。
但是,新版的package被jar命令取代了。
生成的jar包在和target 的目录下。idea好像显示不出来,因此要去对应的目录查看。
2.springboot属性配置方式
3.多环境开发
五、日志
@Slfj 注解
六、热部署
1.手动开启热部署
2.自动开启热部署
3.配置热部署监控的文件范围
4.关闭热部署
七、配置高级@ConfigurationProperties
1.原始。
2.@Bean 第三方bean与@ConfigurationProperties
虽然@Bean是加在方法上的。那么@ConfigurationPropertis可以加在方法上吗?当然可以。
以数据库连接池举例
你可能很疑惑,啥情况,怎么直接就注入进去了?
其实一切的一切都是有根据的。
根据如下,因为DruidDatasource类有下面这个方法,它可以把注解上对应的属性值拿下来。
3.@EnableConfigurationProperties
我理解的是,它可以标记哪些类有@ConfigurationProperties 注解,
但是它不可以找寻带有 @ConfigurationProperties 注解 的类(会报错)
看一下机器人的回答
4.宽松绑定
① @ConfigurationProperties(prefix = "spring.datasource.druid")
中,可以看出必须要 纯小写 , 不然会报错。
② 在我们的application.yml配置文件中,会将属性名 进行转化
像 a-B 在使用@ConfigurationProperties 进行注入时 会被转化为 ab,
例如 server:ipADdress 可以对 属性 ipAdress进行,因为会将两方转成小写。
5.常用计量单位
记得把对应的属性 的 类型 改一下
6.对bean进行校验
KF-2-4.校验
目前我们在进行属性绑定时可以通过松散绑定规则在书写时放飞自我了,但是在书写时由于无法感知模型类中的数据类型,就会出现类型不匹配的问题,比如代码中需要int类型,配置中给了非法的数值,例如写一个“a",这种数据肯定无法有效的绑定,还会引发错误。 SpringBoot给出了强大的数据校验功能,可以有效的避免此类问题的发生。在JAVAEE的JSR303规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架,此处使用Hibernate提供的校验框架来作为实现进行数据校验。书写应用格式非常固定,话不多说,直接上步骤
步骤①:开启校验框架
<!--1.导入JSR303规范-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<!--使用hibernate框架提供的校验器做实现-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
步骤②:在需要开启校验功能的类上使用注解@Validated开启校验功能
@Component
@Data
@ConfigurationProperties(prefix = "servers")
//开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
}
步骤③:对具体的字段设置校验规则
@Component
@Data
@ConfigurationProperties(prefix = "servers")
//开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
//设置具体的规则
@Max(value = 8888,message = "最大值不能超过8888")
@Min(value = 202,message = "最小值不能低于202")
private int port;
}
通过设置数据格式校验,就可以有效避免非法数据加载,其实使用起来还是挺轻松的,基本上就是一个格式。
总结
-
开启Bean属性校验功能一共3步:导入JSR303与Hibernate校验框架坐标、使用@Validated注解启用校验功能、使用具体校验规则规范数据校验格式
八、测试(表现层)
原始的spring怎样整合?
使用springboot整合
怎样手动指定引导类?
使用 参数 classes
1.加载测试专用属性
2. 在测试中加载自己写的配置类,作为bean
3.测试类中启动web环境
默认其实是会根据你的测试代码来决定是否要启动。
不过仍然要加上 下面两个注解
@AutoConfigureMockMvc
@SpringBootTest
4.构建请求 (路径传参和构建json请求体)
5. 执行请求 并比较 预期结果
//定义的controller
@RestController
@RequestMapping("/book")
public class BookController {
@GetMapping
public String getBook(@RequestBody Dog dog){
System.out.println("请求参数是"+dog);
return "我对前端的响应";
}
}
//定义的Dog
@Data
public class Dog {
private String name;
}
@Test
public void testPerform(@Autowired MockMvc mockMvc) throws Exception {
//构建请求(可以指定请求的各种参数)
HashMap<String,String> map=new HashMap<>();
map.put("name","小黑");
MockHttpServletRequestBuilder builder=MockMvcRequestBuilders
.get("/book")//设置请求的路径
.content(JSONObject.wrap(map).toString())//设置请求体,即RequestBody
.contentType(MediaType.APPLICATION_JSON);//设置请求的contentType
//预期结果,即请求执行后的预期响应
//设置响应体的内容
ResultMatcher contentTypeRespected = MockMvcResultMatchers
.content()
.string("我对前端的响应");//String类型的响应 text/plain;charset=UTF-8
// .json(jsonContent) 对json类型的响应
//设置状态码
ResultMatcher statusRespected = MockMvcResultMatchers
.status()
.is(200);
//执行请求并与预期结果比对
mockMvc.perform(builder)
.andExpect(contentTypeRespected)
.andExpect(statusRespected)
.andDo(MockMvcResultHandlers.print());
}