SpringBoot
注解
@SpringBootApplication
启动器,注解在有main()函数的类上。
它整合了以下三个注解:
-
@SpringBootConfiguration
声明当前类是一个配置类,与@Configuration作用相同。 -
@EnableAutoConfiguration
Springboot实现自动化配置的核心注解。通过这个注解把spring应用所需的bean注入容器中。 -
@ComponentScan
自动扫描注解标识的类。默认情况下,它扫描所有类型,并且扫描范围是@ComponentScan注解所在配置类包及子包的类。因为@SpringBootApplication注释的类(XxxApplication)放在所有包的同一目录,所以可以将整个项目的类全部扫描。
@Controller
定义一个控制器类。
分发处理器会扫描使用该类的方法,并检测方法是否使用了@RequestMapping注解,因为该方法才是处理请求的处理器。
@RequestMapping
用法:@RequestMapping(name="/xxx", method= RequestMethod.GET/POST)
SpringBoot提供以下五个注解。
- @GetMapping,处理 Get 请求
- @PostMapping,处理 Post 请求
- @PutMapping,⽤于更新资源
- @DeleteMapping,处理删除请求
- @PatchMapping,用于更新部分资源
@RequestBody
提供对JSON的支持,可以接收JSON格式的数据信息。
@ResponseBody
提供对JSON的支持,可以返回JSON格式的数据信息
@RestController
提供对JSON的支持,定义一个控制器类,其mapping方法无需再写@ResponseBody注解。
@RequestParam
接收url和body的key/value参数。
用法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=”xx”)
可单参数:@RequestParam(“参数名”)
@PathVariable
接收url的单值参数。
用法:
@RequestMapping("/show/{id}/{name}")
public String getUser(@PathVariable("id") Long name, @PathVariable("name") String name) {
return "用户id:"id + "\n用户姓名:" + name;
}
@Valid
数据校验,用在@RequestMapping方法的参数前。
SpringBoot 2.3.3之后,spring-boot-starter-web删除了validation的依赖,需要手动添加。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
用法:
在entity:message为出错时返回信息。
public class User {
@NotEmpty(message="姓名不能为空")
private String name
@NotEmpty(message="密码不能为空")
@Length(min=6,message="密码长度不能小于6位")
private String pass
//嵌套必须加 @Valid,否则嵌套中的验证不生效
@Valid
@NotNull(message = "用户信息不能为空")
private UserInfo userInfo;
}
public class UserInfo {
@NotBlank(message = "年龄不为空")
@Max(value = 100, message = "年龄不能大于100岁")
@Min(value= 18 ,message= "必须年满18岁! " )
private String age;
@NotBlank(message = "性别不能为空")
private String gender;
}
在Controller:
@RequestMapping("/saveUser")
public void saveUser(@Valid @RequestBody User user,BindingResult result) {
System.out.println("user:"+user);
if(result.hasErrors()) {
List<ObjectError> list = result.getAllErrors();
for (ObjectError error : list) {
System.out.println(error.getCode()+ "-" + error.getDefaultMessage());
}
}
}
或者不用BindingResult,此时出错会抛出异常,采用全局异常处理类:
@RestControllerAdvice("club.mydlq.valid") //指定异常处理的包名
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST) //设置状态码为 400
@ExceptionHandler({MethodArgumentNotValidException.class})
public String paramExceptionHandler(MethodArgumentNotValidException e) {
BindingResult exceptions = e.getBindingResult();
// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
if (exceptions.hasErrors()) {
List<ObjectError> errors = exceptions.getAllErrors();
if (!errors.isEmpty()) {
// 这里列出了全部错误参数,按正常逻辑,只需要第一条错误即可
FieldError fieldError = (FieldError) errors.get(0);
return fieldError.getDefaultMessage();
}
}
return "请求参数错误";
}
}
SpringBoot 中使用 @Valid 注解 + Exception 全局处理器优雅处理参数验证
@Service
标志业务层组件。
@Autowired @Resource
@Autowired按byType自动注入
@Resource默认按 byName自动注入,有两个属性:name和type
Filter
@WebFilter 自定义的过滤器器优先级顺序不能⽣生效,推荐使用FilterRegistrationBean。
首先自定义Filter类,继承Filter:
public class MyFilter implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) srequest;
System.out.println("this is MyFilter,url :"+request.getRequestURI());
filterChain.doFilter(srequest, sresponse);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
Configuration:
@Configuration
public class WebConfiguration {
@Bean
public FilterRegistrationBean FilterRegistration1() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
registration.addUrlPatterns("/*");
registration.setName("MyFilter");
registration.setOrder(2);
return registration;
}
@Bean
public FilterRegistrationBean FilterRegistration2() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter2());
registration.addUrlPatterns("/*");
registration.setName("MyFilter2");
registration.setOrder(1);
return registration;
}
}
order低的先执行。
读取配置文件
在 application.properties 中配置:
xxx.yyy=12
xxx.zzz=悠哈抹茶
在 application.yml 中配置:
xxx:
yyy:12
zzz:悠哈抹茶
@Value默认读取 application.properties 或者 application.yml 文件:
@Value("${xxx.yyy}")
private int y;
@ConfigurationProperties(prefix=“xxx”),表示以 xxx 开头的属性会自动赋值到对象的属性中:
//@Component 的定义为实例,⽅便在 Spring Boot 项⽬中引⽤
@Component
@ConfigurationProperties(prefix="xxx")
public class XxxProperties
//数据类型得一致
private int yyy;
private String zzz;
//getter setter⽅法
}
@PropertySource(“classpath:other.properties”)可以自定义配置文件的位置。