DevTools:Spring为开发人员提供的开发期工具(生产环境中自动禁用),作用:(1)代码变更后,应用自动重启(应用程序被加载到两个独立的类加载器中,一个加载main目录下的所有内容,一个加载依赖的库,代码变动时,只用改变一个类加载器,有效降低应用启动时间);(2)自动禁用模板缓存
注解总结:
@SpringBootApplication:实际上是以下3个注解的组合
- @SpringBootConfiguration:@Configuration的特殊形式
- @EnableAutoConfiguration:告诉springboot自动配置它认为我们会用到的组件
- @ComponentScan:启用组件扫描,spring就可以自动发现@Controller等注解的类,并注册为Spring context
@Configuration:该注解用来标记类,告诉spring该类为配置类
@Bean:用来注解被@Configuration注解的类的方法,表明这些方法返回的对象会以bean的形式添加到spring context中
@Controller/@Service/@Repository:查看源码可知,这三个注解在定义时都一样,功能一样,只是为了开发者方便
@ResquestMapping(相对url):一般用来注解Controller类,指定该类处理该url下的HTTP请求
- @GetMapping:一般用来注解被@RequestMapping注解类的方法,相当于对HTTP请求的细化,指定该方法来处理Get类型的HTTP请求。
- @PostMapping:类似GetMapping
@Data:由Lombok提供,使用@Data前需加入org.projectlombok依赖,该注解的作用为:运行时自动为注解的类生成getter、setter方法以及以final属性为参数的构造器。
@Slf4j:同样由Lombok提供,被注解的类会在运行时输出日志,效果等同于:
private static final org.slf4j.Logger log= org.slf4j.LoggerFactory.getLogger(被注解类名.class)
测试相关注解:
- @SpringBootTest:告诉JUnit在启动测试时要添加上SpringBoot的功能,即该测试类相当于main()方法中的Spring
Application.run() - @RunWith():括号中放入测试运行器来指导JUnit进行如何测试,一般放SpringRunner.class
- @WebMvcTest:将被注解的类注册到Spring MVC中,这样就可以在测试时利用Spring MVC进行访问请求等
表单校验:
spring支持Java的Bean校验API(Bean Validation API),可以通过一些注解完成校验的功能,例:
@NotNull:限制该属性不能为空
@Size(min=3,message=“至少长度为3”):限制长度并在不符合要求时提示
@NotBlank(message=“提示信息”):保证被注解的属性不为空
等等…
注意,这种注解限制如果后续没有逻辑进行处理,是不会报错且能继续执行后续逻辑的
例,在创建Taco类时进行了属性限制:
public class Taco {
@NotNull
@Size(min=5, message="Name must be at least 5 characters long")
private String name;
@Size(min=1, message="You must choose at least 1 ingredient")
private List<String> ingredients;
}
但在逻辑中,未对Taco对象进行校验:
@PostMapping
public String processDesign( Taco design, Errors errors, Model model) {
if (errors.hasErrors()) {
return "design";
}
log.info("Processing design: " + design);
return "redirect:/orders/current";
}
该方法并不能捕获到error,从而不执行if中程序,相当于对Taco属性的限制不起作用
…
那么,如何在后续进行校验呢?
在processDesign方法中,对Taco对象用@Valid注解:
public String processDesign(@Valid Taco design, Errors errors, Model model) {
//如果@Valid注解的对象存在校验错误,该错误便会被捕获传递给processDesign方法
虽然此时错误被捕获,但是如何显示在浏览器端,给用户反馈呢?
可以使用Thymeleaf提供的方法,在前端用以下代码展示错误:
<span class="validationError"
th:if="${#fields.hasErrors('ingredients')}"
th:errors="*{ingredients}">Ingredient Error</span>
小改进:对于没有处理输入的@Controller,可以将其直接定义为配置类,实现相同的功能,从而减少Controller数量:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry){
//匹配请求url为“/”,并转发到“home1”试图上去
registry.addViewController("/").setViewName("home1");
}
}