SppringBoot常用注解
1. @SpringBootApplication2. Spring Bean 相关
1) @Autowired
2) @Component,@Service,@Controller,@Repository
3) RestController
4) @Scope
5) @Configuration
3. 处理常见的HTTP请求类型
1) GET请求
2) POST请求
3) PUT请求
4) DELETE请求
5) PATCH请求
4. 前后端传值
1) @PathVariable和@RequestParam
2) @RequestBody
5. 读取配置信息
1) @Value
2) @ConfigurationProperties
3) PropertySource
6. 参数校验
1) 一些常用的字段验证的注解
2) 验证请求体RequestBody
3) 验证请求参数(Path Variables和Request Parameters)
7. 全局处理Controlelr层异常
9. JPA相关操作
1) 创建表
2) 创建主键
3) 设置字段类型
4) 指定不持久化特定字段
5) 声明大字段(详解请百度)
6) 创建枚举类型的字段
7) 增加审计功能(详解请咨询度娘)
8) 删除和修改功能
9) 关联关系
10. 事务 @Transactional
11. Json数据处理
- @SpringBootApplication
功能:这个注解是Spring Boot项目的基石,创建项目之后会自动在主类上加上该注解。
@SpringBootApplication
public class SpringSecurityJwtGuideApplication{
public static void main(java.lang.String[ ] args){
SpringApplication.run(SpringSecurityJwtGuideApplication.class,args);
}
}
我们可以把@SpringBootApplication看作是@SpringBootConfiguration和EnableAutoConfiguration以及@ComponentScan三个注解的集合。
@EnableAutoConfiguration:启用SpringBoot的自动配置机制。
ComponentScan:扫描被@Component(@Service和@Controller)注解所标注的bean,注解默认会扫描该类所在包下的所有类。
Configuration:允许在Spring上下文中注册额外的bean或导入其他配置类。
- Spring Bean 相关
- @Autowired
自动导入对象到类中,被注入进的类同样要被Spring容器管理,比如Service类注入到Controller类中。 - @Component,@Service,@Controller,@Repository
我们一般@Atowired注解让Spring容器帮我们自动装配bean。要想把类标识成可用@Autowired注解自动装配的bean的类,可以采用以下注解实现。
@Component : 通用的注解,可以标注任意的类为Spring组件。如果一个bean不知道是属于哪一层,就可以用@Component注解标注。
@Repository : 对应持久层,即dao层,主要用于和数据库的相关操作。
@Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到Dao层。
@Controller : 对应Spring Mvc 的控制层,主要用于接受用户请求并调用Service层把数据传给前端。 - RestController
@RestController 注解是@Controlelr注解和@ResponseBody注解的集合,表示这是一个控制器bean,并且是将函数的返回值直接填入HTTP响应体中,是REST风格的控制器,即直接把返回值输出到一个空白的html页面上。
单独使用@Controler控制器不加@ResponseBody的话一般要使用在要返回一个视图,,但如果加上@ResponseBody则返回值可以直接在页面显示出来。 - @Scope
用于声明Spring Bean 的作用域。
@Bean
@Scope(“Singleton”)
public Person PersonSingleton(){
return new Person();
]
四种常见的Spring Bean 的作用域:
singleton : 唯一的bean实例,Spring 中的bean默认是单实例的。
prototype : 每次请求都会创建一个新的bean实例。
request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前的HTTP的request内有效。
session : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP的session内有效。 - @Configuration
一般用来声明配置类,可以使用@Conponent注解代替,不过使用@Configuration注解声明配置类更加语义化。
@Configuration
public class AppConfig{
@Bean
public Person personTest(){
return new Person();
}
}
- 处理常见的HTTP请求类型
5种常见的请求类型:
GET :请求从服务器获得特定的资源。举个例子:GET/users(获取所有学生)
POST : 在服务器上创建一个新的资源。例如:POST/users(创建学生)
PUT : 更新服务器上的资源(客户端提供更新后的整个资源)。例如:PUT/users/12(更新编号为12的学生)
DELETE : 从服务器删除特定的资源。例如:DELETE/users/12(删除编号为12的学生)
PATCH : 更新服务器上的资源,(客户端提供更改的属性,可以看作是部分更新),这个使用的比较少。
- GET请求
@GetMapping(“users)等价于
@RequestMapping(value=”/users”,method=RequestMethod.GET)
@GetMapping(“/users”)
public User findUser(){
return userService.findAll();
} - POST请求
@PostMapping(“users”)等价于
@RequestMapping(value=”/users”,method=”RequestMethod.POST”)
@PostMapping(“/users/user”)
public User createUser(@valid @RequestBody Users user){
return userService.save(user);
} - PUT请求
@PutMapping(“/users/{userId}”)等价于
@RequestMapping(value=”/users/{userId}”,method=”RequestMethod.PUT”)
@PutMapping(“/users/{userId}”)
public User updateUser(@PathVariable(value = “userId”) Long userId,
@Valid @RequestBody Users user){
…………………
} - DELETE请求
@DeleteMapping (“/users/{userId}”)等价于
@RequestMapping(value=”/users/{userId}”,method=”RequestMethod.DELETE”)
@DeleteMapping(“/users/{userId}”)
public User deleteUser(@PathVariable(value = “userId”) Long userId){
…………………
} - PATCH请求
一般实际项目中,我们都是PUT不够用了之后我们采用PATCH请求去更新数据。
- 前后端传值
- @PathVariable和@RequestParam
@PathVariable用于获取路径参数,@RequestParam用于获取查询参数。
路径参数:localhost/8080/query/user
查询参数:localhost/8080/query?user - @RequestBody
用于后去接收request请求的body部分,接收到的数据会自动绑定到java对象上去。
@PostMapping(“/sine-up“)
public void sineUp(@RequestBody @Valid User user){
}
注意:一个请求方法只有一个@RequestBody,但是可以有多个@PathVariable和@RequestParam。
5. 读取配置信息
我们的数据源application.yml配置信息如下:
wuhan2020:
2020年初武汉爆发了新型冠状病毒,疫情严重,但是,我相信一切都会过去!武汉加油!中国加油!
my-profile:
name: Guide哥
email: koushuangbwcx@163.com
library:
location: 湖北武汉加油中国加油
books:
-name: 天才基本法
description: 二十二岁的林朝夕在父亲确诊阿尔茨海默病这天,得知自己暗恋多年的校园男神裴之即将出国深造的消息——对方考取的学校,恰是父亲当年为她放弃的那所。
- name: 时间的秩序
description: 为什么我们记得过去,而非未来?时间“流逝”意味着什么?是我们存在于时间之内,还是时间存在于我们之中?卡洛·罗韦利用诗意的文字,邀请我们思考这一亘古难题——时间的本质。
- name: 了不起的我
description: 如何养成一个新习惯?如
- @Value
使用@Value(“ p r o p e r t y ” ) 读 取 比 较 简 单 的 配 置 信 息 。 @ V a l u e ( “ {property}”)读取比较简单的配置信息。 @Value(“ property”)读取比较简单的配置信息。@Value(“{wuhan2020}“)
String wuhan2020; - @ConfigurationProperties
通过该注解读取配置文件中的信息,并且与bean绑定。
@Component
@ConfigurationProperties(prefix=”library”)
class LibraryProperties{
private String location;
private String book;
…….
………
}
3) PropertySource
@PropertySource读取指定properties文件
@Component
@PropertySource(“classpath:website.properties”)
class WebSites{
@Value(“${url}”)
private String url;
省略url的get和set方法。
}
- 参数校验
注:即使在前端对数据进行校验的情况下,后端也需要对数据进行校验,避免用户绕过浏览器直接通过一些HTTP工具直接向后端请求一些危险违法的数据。
JSR(Java Specification Requests)是一套JavaBean参数校验的标准,它定义了很多常用的参数校验注解,我们可以直接将这些注解加在我们JavaBean属性上面,,从而进行参数校验。而且我们现在常用的JSR参数校验框架是根据Hibernate Validate框架改编而来的。
Hibernate Validate版本 JSR版本 JSR对应编号
4.x 1.0 JSR303
5.x 1.1 JSR349
6.x 2.0 JSR380
注意:SpringBooot 的项目的spring-boot-starter-web依赖中已经有hibernate-validate包,不需要引用相关的依赖。除此之外所有的注解推荐使用JSR注解,即使用javax.validation.constraints,而不是org.hibernate.validator.constraints.
- 一些常用的字段验证的注解
@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,faction)被注释的元素必须为一个数字,其值必须在可接受的范围内。
@Past被注释的元素必须是一个过去的日期。
@Future被注释的元素必须是一个将来的日期。 - 验证请求体RequestBody
public class person{
@Size(max= 33)
@NotNull(message = “name不能为空”)_
private String name;
@NotNull(message = “id不能为空”)
private int id;
}
我们再需要验证的参数上加上注解@Valid,如果验证失败,它将抛出MethodArgumentNotValidException;
public class PersonController{
@PostMappting(“/person”)
public void login(@RequestBody @Valid Person person){
…………
}
}
3) 验证请求参数(PathVariables和RequestParameters)
注意:一定不啊哟忘记了在类上加Validate注解,这个注解可以告诉Spring方法去校验方法参数。
public class PersonController{
@PostMappting(“/person/{id}”)
public void query(@Vald@PathVariable (“id”) @Max(value = 5,message = “超过了id的范围”) integer id){
…………
}
}
7. 全局处理Controlelr层异常
相关注解:@ControllerAdivice :该注解定义全局异常处理类。
相关注解:@ExceptionHandler :该注解声明异常处理方法。
用法介绍:处理参数校验异常MethodArgumentNotValidException。
@ControllerAdivice
@ReponseBody
public class GlobaleExceptionHandler{
@ExceptionHandeler(MethodArgumentNotValidException.class)
public ReponseEntry handlerMethodArgumentNotValidException(MethodArgumentNotValidException e,HttpServletRequest request){
………Exception处理方法…
}
}
8. JPA相关操作
- 创建表
@Entity 声明一个类对应一个数据库实体。
@Table 声明表明,如果不写默认用该类名的小写。
@Entiry
@Table(name = “role”)
public class Role(){
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private String description;
……省略get和set方法
} - 创建主键
@Id 声明一个字段为主键。
注意:使用@Id之后我们还得定义主键的生成策略。我们可以使用@GeneratedValue指定生成策略。
(1) 通过@GeneratedValue直接使用JPA内置提供的四种主键生成策略来指定主键的生成策略。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
JPA使用枚举定义了4种常见的主键生成策略:
public enum GenerationType{
/**使用一个特定的数据库表来保存主键
*持久化引擎通过关系型数据库的一张特定的表格来生成主键
*/
TABLE;
/**在某些数据库中不支持自动增长,比如Oracle、PostgreSQL为其提供了一
种叫做序列(seque)的机制生成主键
/
SEQUENCE;
/
主键自动增长
/
IDENTITY;
/
*把主键生成策略交给持久化引擎(persistence engine)
*持久化引擎会根据数据库在以上三种主键生成策略中选择一种。
*/
AUTO;;
}
注意:@GeneratedValue默认的主键生成策略时GenerationType.AUTO;
一般MYSQL数据库使用IDENTITY策略会比较多一点。
(2) 通过GenericGenerator声明一个主键策略,然后通过@GeneratedValue使用这个策略。
@Id
@GeneratedValue(generator = “IdentityGenerator”)
@GenericGenerator(name =”IdentityGenerator” , strategy =”identity”)
private int id;
等同于
@Id
@GeneratedValue(strategy =GenerationType.IDENTITY)
private int id;
- 设置字段类型
@Column声明字段
示例:
设置userName对应的数据库字段名为user_name,长度为32,非空。
@Column(name = “user_name” ,nullable =false,length =32)
private String username;
设置字段类型,并且加上默认值。(常用)
@Column(ColumnDefinition =”tinyint(1) default 1”
private Boolean enable; - 指定不持久化特定字段
@Transient :声明不需要与数据库映射的字段,在保存的时候不需要保存进数据库。
示例:
如果我们不想要让secret这个字段在数据库中映射,可以如下:
@Transient
private String secret;
上面作用同下
static String secret;
final String secret = “aaa”;
transient String secret; - 声明大字段(详解请百度)
@Lob :声明某个字段为大字段
@Lob
private Strng content; - 创建枚举类型的字段
可以使用枚举类型的字段,不过枚举字段要用@Enumerated注解修饰。
public enum Gender{
MALE(“男性”);
FEMALE(“女性”);
private String value;
Gender(String str){
value = str;
}
}
@Entity
@Table(name =”role”)
public class{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@Enumerated(EnumType.STRING)
private Gender gender;
省略get和set方法…………………………
}
数据库里存储的对应的是MALE/FEMALE。
7) 增加审计功能(详解请咨询度娘)
只要继承了AbstractAuditBase的类都会默认加上四个字段。
注意注解:
@CreatedDate :表示这个字段为创建时间字段,在这个给实体被insert的时候,会被设置值。
@CreatedBy :表示该字段为创建人,在这个实体被insert的时候,会设置值。
@LastModifiedDate和@LastModifiedBy同理
@EnableJpaAuditing :开启JPA审计功能。
8) 删除和修改功能
@Modifying 注解提示JPA该操作是修改操作,注意嗨哟啊配合@Transactional使用。
@Modifying
@Transactional(rollbackFor =Exception.class)
void deleteByName(String userName);
9) 关联关系
@OneToOne声明一对一关系。
@OneToMany声明一对多关系。
@ManyToOne 声明多对一关系。
@ManyToMany声明多对多关系。
9. 事务 @Transactional
在要开启事务的方法上面使用@Transactional注解即可。
@Transactional(rollback = Exception.class)
public void save(){
……………
}
我们知道Exception 分为运行时异常RuntimeException和非运行时异常。在@Transactional注解中如果不配置rollbackFor属性,那么事务只会在遇到Runtime Exception的时候才会回滚,加上rollbacFor=Exception.class,可以让事务在遇到非运行时异常时也回滚。
@Transaction注解一般可以作用在类或者方法上。
作用于类: 当把@Transaction注解放在类上时,表示所有该类的public方法都配置相同的事务信息。
作用域方法: 当类配置了@Transaction,方法也配置了@Tansaction注解的时候,方法的事务会覆盖类的事务配置信息。
10. Json数据处理
- 过滤json数据(详细请问度娘)
@JsonIgnoreProperties作用在类上用于过滤掉特定字段不反回或不解析。
@JsonIgnore一般作用于属性上面,用于过滤掉特定属性不返回或者不解析。 - Json数据格式化
@JsonFormat - 扁平化对象
@JsonUnwraped
- 测试相关
@ActiveProfiles一般作用于测试类上,用于声明有效的Spring配置文件。
@Test声明一个方法为测试方法。
@Transactional被声明的测试方法的数据会回滚,避免污染测试数据。
@WithMockUser 是Spring Security提供的用来模拟一个真实用户,并且赋予权限。