Spring和SpringBoot常⽤注解
1.@SpringBootApplication
⼀般我们不会主动去使⽤它。
注:这个注解是SpringBoot的基⽯,创建SpringBoot项⽬后会默认在主类加上。
我们可以把@SpringBootApplication看作是@Configuration、@EnableAutoConfiguration、@ComponentScan注解的集合。
中秋 祝福短信@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}),
@Filter( type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class})
}
)
public @interface SpringBootApplication {}
@EnableAutoConfiguration:启动SpringBoot的⾃动配置机制(开启⾃动装配)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "ableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
@ComponentScan:扫描被@Component(@service、@Controller)注解的bean,注解默认会扫描该类所在的包下所有的类。
@Configuration:允许在Spring上下⽂中注册额外的bean或导⼊其他配置类。
2.Spring Bean相关
2.1 @Autowired
⾃动导⼊对象到类中,被注⼊进的类同样要被Spring容器管理,⽐如:Service类注⼊到Controller类中。
2.2 @Component、@Repository、@Service、@Controller
我们⼀般是⽤@Autowired注解让@Spring容器帮我们⾃动装配bean,要想把类标识成可⽤于@Autowired注解⾃动装配的bean类,可以采⽤以下注解实现:
@Component:通⽤的注解,可标注任意类为Spring组件,如果⼀个bean不知道属于哪⼀层,可以使⽤@Component来注解标注。
@Repository:对应持久层即Dao层,主要⽤于数据库相关操作。
@Service:对应服务层,主要处理⼀些复杂的逻辑,需要⽤到Dao层。
@Controller:对应Spring mvc控制层,主要是接收⽤户请求并调⽤service层返回数据给前端页⾯。
2.3 @RestController
@Controller+@ResponseBody的集合,返回json或xml形式数据。
2.4 @Scope
声明Spring Bean的作⽤域,使⽤⽅法:
@Bean
@Scope("singleton")
public Person personSingleton(){
return new Person();
}
四种常见的Spring Bean的作⽤域:
(1)singleton:唯⼀的bean实例,在Spring中的bean默认都是单例的。
(2)prototype:每次请求都会创建⼀个新的bean实例。
(3)request:每次Http请求都会创建⼀个新的bean实例,当前bean只在HTTP request内有效
(4)session:每次Http请求都会创建⼀个新的bean实例,当前bean只在HTTP session内有效
2.5 @Configuration
⼀般⽤来声明配置类,可以使⽤@Component注解替代,不过@Configuration注解声明配置类更加语义化。3.处理常见得Http请求类型
考生号查询3.1 GET请求
请求从服务器获取特定资源。举个例⼦:GET /users(获取所有⽤户)
3.2 POST请求
在服务器上创建⼀个新的资源。举个例⼦:POST /users(创建⽤户)
3.3 PUT请求
更新服务器上的资源(客户端提供整个更新后的资源),举个例⼦:PUT /users/12(更新编号为12的⽤户)3.4  DELETE请求
从服务器上删除特定的资源,举个例⼦:DELETE /users/12(删除编号为12的⽤户)
3.5 PATCH请求
更新服务器上的资源(客户端提供更改的属性,可以看做是部分更新),是⽤的⽐较少。
4.前后端传值
4.1 @PathVariable、@RequestParam
@PathVariable⽤于获取路径参数
@RequestParam⽤于获取查询参数
4.2 @RequestBody
⽤于读取Request请求(可能是POST\PUT\DELETE\GET请求)的body部分,并且Content-Type为application/json格式的数据,接收到数据之后会⾃动将数据绑定到java对象上去。系统会使⽤HttpMessageConverter或者⾃定义的HttpMessageConverter将请求的body中的json字符串转换为java对象。
需要注意的是:⼀个请求⽅法只可以有⼀个@RequestBody,但是可以有多个@PathVariable、@RequestParam。
5.读取配置信息
我们会讲⼀些常⽤的配置信息放到配置⽂件,下⾯我们看⼀下Spring为我们提供了哪些⽅式帮我们从配置⽂件中读取这些配置信息。
5.1 @Value(常⽤)
使⽤@Value("${property}")读取⽐较简单的配置信息
@Value("${wuhan2020}")
读取配置文件失败String wuhan2020;
5.2 @ConfigurationProperties(常⽤)
通过@ConfigurationProperties读取配置信息并与bean绑定。
5.3 @PropertySource(不常⽤)
@PropertySource读取指定的properties⽂件
@Component
@PropertySource("classpath:website.properties")
class WebSite{
@Value("${url}")
private String url;
省略getter/setter
......
}李玟多大
6.参数检验
6.1 ⼀些常⽤的字段验证的注解
@NotEmpty 被注释的字符串的不能为 null 也不能为空
@NotBlank 被注释的字符串⾮ null,并且必须包含⼀个⾮空⽩字符
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Pattern(regex=,flag=)被注释的元素必须符合指定的正则表达式
@Email 被注释的元素必须是 Email 格式。
@Min(value)被注释的元素必须是⼀个数字,其值必须⼤于等于指定的最⼩值
@Max(value)被注释的元素必须是⼀个数字,其值必须⼩于等于指定的最⼤值
@DecimalMin(value)被注释的元素必须是⼀个数字,其值必须⼤于等于指定的最⼩值
@DecimalMax(value) 被注释的元素必须是⼀个数字,其值必须⼩于等于指定的最⼤值
药水哥为什么被永封@Size(max=, min=)被注释的元素的⼤⼩必须在指定的范围内
@Digits (integer, fraction)被注释的元素必须是⼀个数字,其值必须在可接受的范围内
@Past被注释的元素必须是⼀个过去的⽇期
@Future 被注释的元素必须是⼀个将来的⽇期
......
6.2 验证请求体(RequestBody)
我们在需要验证的参数加上@Valid注解,如果验证失败,他将抛出MethodArgumentNotValidException 例如:
getPerson(@RequestBody @Valid Person person){
......
}古埃及文明
6.3 验证请求参数(Path Variables 和 Request Parameters)
⼀定不要忘记再累上加上@Validated注解,这个参数可以告诉Spring去校验⽅法参数。
@RestController
@RequestMapping("/api")
@Validated
public class PersonController {
@GetMapping("/person/{id}")
public ResponseEntity<Integer> getPersonByID(
@Valid @PathVariable("id") @Max(value=5,message = "超过 id 的范围了") Integer id) {
return ResponseEntity.ok().body(id);
}
}
7.全局处理Controller层异常
相关注解:1.@ControllerAdvice:注解定义全局异常处理类
2.@ExceptionHandler:注解声明异常处理⽅法
那我们上⾯的例⼦校验,如果⽅法参数不对的话就会抛出MethodArgumentNotValidException
我们来处理这个异常:
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
/**
* 请求参数异常处理
*/
@ExceptionHandler(
MethodArgumentNotValidException.class)
public ResponseEntity<?>
handleMethodArgumentNotValidException(MethodArgumentNotValidException ex,                                                                                                HttpServletRequest request) {
......
}
}
8.JPA相关
8.1 创建表
@Entity声明⼀个类对应⼀个数据库实体。
@Table 设置表名称
@Entity
@Table(name = "role")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String description;
省略
}
8.2 创建主键
@Id :声明⼀个字段为主键。
使⽤@Id声明之后,我们还需要定义主键的⽣成策略。我们可以使⽤ @GeneratedValue 指定主键⽣成策略。