1. @SpringBootApplication
这个是Springboot的最核心的注解,在Springboot创建的时候,自动加在主类上。用来开启Springboot的各项能力。
@SpringBootApplication
public class SimpleApplication {
public static void main(String[] args) {
SpringApplication.run(SimpleApplication.class, args);
}
}
查看源码发现@SpringbootApplication是一个复合注解,他包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
}
@SpringbootConfiguration注解,继承@Configuration注解,主要用于加载配置类。两者的功能一致,标注当前类是配置类,将当前类内声明的一个或者多个以@Bean注解标记的方法的实例纳入到Spring容器中,并且实例名就是方法名。
@EnableAutoConfiguration注解,开启自动配置功能,将Springboot项目中符合@Configuration注解的配置类都加载到Springboot的IOC容器中。
@ComponentScan注解,主要用于组件扫描和自动装配,用来自动扫描被这些注解标识的类,最终生成ioc容器里的bean,默认扫描范围是@ComponentScan注解所在配置类包及子包的类。
2. Spring Bean 相关
2.1 @Autowired
@Autowired注解可以让Spring容器自动将符合类型的Bean对象注入到需要的属性,构造方法或方法参数中。通过@Autowired注解标记的属性,Spring容器在运行时,就会自动查找该属性所对应的Bean,并自动注入到该属性中,从而实现自动装配。
@Service
public class UserService {
......
}
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
......
}
2.2 @Component、@Service、@Controller、@Repository
我们一般使用@Autowired注解让SPring容器帮我们自动装配bean。被@Component,@Service,@Controller,@Repository注解标注的类,这些类会被纳入进spring容器中管理。
• @Component:通用注解,可标注任意类为Spring组件。如果一个Bean不知道属于哪个层,可以使用@Component注解标注。
• @Service:对应服务层。主要涉及一些复杂的逻辑。
• @Controller:对应控制层,主要接受用户请求并调用Service层返回数据给前端页面。
• @Reponsitory:对应持久层。主要用于数据库相关操作。
2.3. @RestController
@RestController注解是@Controller和@ResponseBody注解的合集,表示这是个控制器bean,并且将函数的返回值直接填入Http响应体中中,是Rest风格的控制器。
单独使用@Controller不加@ResponseBody的话一般使用在返回一个视图的情况,这种情况属于比较传统的Spring MVC应用,对应前后端 不分离的情况。@RestController返回JSON或者XML形式数据。
2.4 @Scope
该注解用于指定作用范围。经常搭配@Controller,@Service,@Repository,@Component,@Bean使用,修饰类
四种常见的SpringBean的作用域:
• singleton:唯一Bean实例
四种常见的 Spring Bean 的作用域:
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
- prototype : 每次请求都会创建一个新的 bean 实例。
- request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
- session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
2.5. @Configuration
@Configuration注解一般用来声明配置类,可以使用@Component注解替代,不过使用@Configuration注解声明配置类更加规范。
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
3. 常见的HTTP请求的注解
3.1 GET请求
Get请求一般使用@GetMapping("user")或者@RequestMapping(value="/user", method = RequestMethod.GET)
@GetMapping("/user")
// 或者 @RequestMapping(value="/user", method = RequestMethod.GET)
public ResultObj getAllUser() {
return new ResultObj(userService.selectList());
}
3.2 POST请求
一般用于表单提交,使用@PostMapping("/userIns")注解或者@RequestMapping(value="/userIns", method = RequestMethod.POST)
@ResponseBody
@PostMapping("/userIns")
// 或者 @RequestMapping(value="/userIns", method = RequestMapping.POST)
public ResultObj insertUser(@Valid @RequestBody UserVo userVo) {
userService.insert(userVo);
return new ResultObj();
}
3.3 PUT请求
@PutMapping("/userInfo/{userId}")或者@RequestMapping(value="/userInfo/{userId}", method=RequestMethod.PUT)
@ResponseBody
@PutMapping("/userInfo/{userId}")
public ResultObj updateUser(@PathVariable(value = "userId") String userId, @Valid @requestBody UserVo userVo) {
userService.updateUser(userVo);
User user = userService.selectById(userId);
return new ResultObj(userService.UpdateUser(user));
}
3.4 DELETE请求
@DeleteMapping("/deleteUser/{userId}")或者@Request(value="/deleteUser/{userId}", method=RequestMathod.DELETE)
@DeleteMapping("/deleteUser/{userId}")
public ResultObj deleteUser(@PathVariable(value = "userId") String userId){
userService.deleteUser(userId);
return new ResultObj();
}
4. 前后端传值
4.1 @ReuestParam和@PathVariable
@RequestParam注解用于获取查询参数,@PathVariable用于获取路径参数。
@ResponseBody
@RequestMapping("/agree/{userId}")
public ResultObj getUserInfo(
@PathVariable("userId") String userId) {
return ResultObj(userService.selectById(userId));
}
@ResponseBody
@RequestMapping("/agree?userId=123")
public ResultObj getUserInfo(
@RequestParam(value = "userId", required = false) String userId) {
return ResultObj(userService.selectById(userId));
}
4.2 @RequestBody
@RequestBody注解用于读取Request请求的body部分并且Content-Type为application/json格式的数据,接收到数据之后会自动将数据绑定到Java对象上去。系统会使用HttpMessageConverter或者自定义的HttpMessageConverter将请求的body中的json字符串转换为java对象。
@ResponseBody
@RequestMapping("/insUser")
public ResultObj insertUser(
@RequestBody(required = false) UserVo userVo) {
// userVo是一个Bean对象
userService.insertUser(userVo);
return new ResultObj();
}
我们发送 post 请求到这个接口,并且 body 携带 JSON 数据:
{"userNmae":XXXX, "sex"="男".....}
一个请求方法只可以有一个@RequestBody, 但是可以有多个@RequestParam和@PathVariable。
5. 读取配置信息
5.1 @Value
yml文件
username: XXXX
@Value("${username}")
private String userName;
5.2 @ConfigurationProperties
通过@ConfigurationProperties读取配置信息并和bean绑定。
yml文件
user:
userName: XXX
userId: 123
@Data
@Component
@ConfigurationProperties(prefix = "user")
public clase UserProperties {
private String userName;
private String userId;
}
5.3 @PropertySource
@PropertySource注解读取指定的properties文件
@Configuration
@PropertySource("classpath:foo.properties")
public class PropertiesWithJavaConfig {
//...
}
// 读取多个配置文件
@PropertySources({
@PropertySource("classpath:foo.properties"),
@PropertySource("classpath:bar.properties")
})
public class PropertiesWithJavaConfig {
//...
}
6. 参数校验
数据校验很重要,即使在前端对数据已经进行校验的情况下,我们还是要多传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些HTTP工具直接向后端请求一些违法数据。
JSR(Java Specification Requests)是一套JavaBean参数校验的标准,他定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,非常方便。校验的时候我们实际用的是Hibernate Validator框架。Springboot项目的spring-boot-starter-web依赖中已经有了hibernate-validator包,不需要医用祥光依赖。
需要注意的是,所有的校验注解,推荐使用JSR注解(javax.validation.constraints),而不是org.hibernate.validator.constraints
6.1 常用的字段校验注解
常见的注解 | ||
注解 | 数据类型 | 说明 |
@NotNull | 任意类型 | 验证注解的元素值不是null |
@Null | 任意类型 | 验证注解的元素值是null |
@AssertFalse | Boolean,boolean | 验证注解的元素值是false |
@AssertTrue | Boolean,boolean | 验证注解的元素值是true |
@Min(value=值) | int,long,shot,BigDecimal,byte等任何number子类型 | 验证注解的元素值大于等于指定的value值 |
@Max(value=值) | 和@Min一样 | 验证注解的与那苏值小于等于指定的value值 |
@DecimalMin(value=值) | 和@Min一样 | 验证注解的元素值大于等于指定的value值 |
@DecimalMax(value=值) | 和@Min一样 | 验证注解的而元素值小于等于指定的value值 |
@Size(min=下限, max=上限) | 字符串,集合(Collection,Map,数组等) | 验证注解的元素值在min和max指定区间之内,如字符长度,集合大小 |
@Past | Date,Calendar,Time日期类型 | 验证注解的元素值(日期类型)比当前时间早 |
@Future | 和@Past一样 | 验证注解的元素值(日期类型)比当前时间晚 |
@NotBlank | CharSequence子类型 | 验证注解的元素值不能为空(不能为null,且去除首尾的空格后长度不能为0) |
@Length(min=下限, max=上限) | CharSequence子类型 | 验证注解的元素值长度在min和max之间 |
@NotEmpty | CharSequence子类型,Collection,Map,数组 | 验证注解的元素值不为null且不能为空(字符串的长度不能为0,集合大小不能为0) |
@Range(min=最小值, max=最大值) | int,long,short,BigDecimal,BigInteger等原子类型和包装类型 | 验证注解的元素值在最小值和最大值之间 |
String | 验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式。 | |
@Valid | 任何非原子类型 | 指定递归验证的对象,如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可 |
@Posttive | 和@Min一样 | 适用于数值并验证它们是正数 |
@PositiveOrZero | 和@Min一样 | 适用于数值并验证他们是正数,包括0 |
@Negative | 和@Min一样 | 适用于数值并验证它们是严格的负数 |
@NegativeOrZero | 和@Min一样 | 适用于数值并验证它们是严格的负数,包括0 |
@PastOrPresent | Date,Calendar,Time的日期类型 | 验证日期值是过去,包括现在 |
@FutrueOrPresent | Date,Calendar,Time的日期类型 | 验证日期值是将来,包括现在 |
6.2 验证请求体(@RequestBody)
定义一个Bean
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserVo {
@NotNull(message = "classId 不能为空")
private String classId;
@Size(max = 33)
@NotNull(message = "name 不能为空")
private String name;
@Pattern(regexp = "((^Man$|^Woman$|^UGM$))", message = "sex 值不在可选范围")
@NotNull(message = "sex 不能为空")
private String sex;
@Email(message = "email 格式不正确")
@NotNull(message = "email 不能为空")
private String email;
}
@ResponseBody
@RequestMapping("/insUser")
public ResultObj insertUser(
@RequestBody @Valid UserVo userVo) {
userService.insertUser(userVo);
return new ResultObj();
}
6.3 验证请求参数(PathVariable和RequestParam)
@RestController
@Validated // 一定要在类上加上Validated注解
public clase UserController {
@ResponseBody
@RequestMapping("/agree/{userId}")
public ResultObj getUserInfo(
@PathVariable("userId") @NotNull(message = "不能为空") String userId) {
return ResultObj(userService.selectById(userId));
}
}
7. 全局处理Controllerceng异常
相关注解
- @ControllerAdvice:定义全局异常处理类
- @ExceptionHandler:声明异常处理方法
@Slf4j
@ControllerAdvice
public class ExceptionHandleServiceImpl implements ExceptionHandleService {
@ExceptionHandler(RuntimeException.class)
public ResultObj runtimeException(RuntimeException e) {
log.info("运行时异常:{}", ExceptionUtil.getStackTraceInfo(e));
return errorReturn(ErrorCode.SERVER_ERROR, e.getMessage());
}
}
8. JPA相关
8.1 创建表
- @Entity声明一个类对应一个数据库实体
- @Table设置表名
@Data
@Entity
@Table(name = "role")
public class Role {
private Long id;
private String name;
private String description;
}
8.2 创建主键
使用@Id声明之后,我们还需要定义主键的生成策略。我们可以使用@GeneratedValue指定主键生成策略
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
可以指定的策略
public enum GenerationType {
/**
* 使用一个特定的数据库表格来保存主键
* 持久化引擎通过关系数据库的一张特定的表格来生成主键,
*/
TABLE,
/**
*在某些数据库中,不支持主键自增长,比如Oracle、PostgreSQL其提供了一种叫做"序列(sequence)"的机制生成主键
*/
SEQUENCE,
/**
* 主键自增长
*/
IDENTITY,
/**
*把主键生成策略交给持久化引擎(persistence engine),
*持久化引擎会根据数据库在以上三种主键生成 策略中选择其中一种
*/
AUTO
}
8.3 设置字段类型
- @Column声明字段
@Column(name = "user_name", nullable = false, length=32)
private String userName;