SpringBoot常用注解

SpringBoot常用注解

@SpringBootApplication

SpringBoot最最最核心的注解,包含了@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan三个注解。

  1. @SpringBootConfiguration 允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
  2. @EnableAutoConfiguration 启用 SpringBoot 的自动配置机制
  3. @ComponentScan 扫描被@Component,@Repository,@Service,@Controller,@RestController注解的 bean,注解默认会扫描该类所在的包下所有的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package org.springframework.boot.autoconfigure;
@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 {
// ......
}

package org.springframework.boot;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

@Component,@Repository,@Service,@Controller,@RestController

  1. @Component:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
  2. @Repository:标注数据访问组件,即 DAO 组件。
  3. @Service:标注服务组件,即 Service 组件,主要涉及一些复杂的逻辑。
  4. @Controller:标注控制器组件,即 MVC 控制层组件,在前后端不分离的项目中,通常使用这个注解进行标注,返回视图,如果需要返回 JSON 数据,需要在方法上添加@ResponseBody注解。
  5. @RestController:等价于@Controller+@ResponseBody,标注控制器组件,即 MVC 控制层组件,在前后端分离的项目中,通常使用这个注解进行标注,返回 JSON 数据。

@Scope

声明 Spring Bean 的作用域

  1. singleton:单例模式,Spring 容器中只会存在一个实例,每次获取都是同一个实例。
  2. prototype:原型模式,每次获取都会创建一个新的实例。
  3. request:每次 HTTP 请求都会创建一个新的实例,该实例仅在当前 HTTP 请求内有效。
  4. session:每次 HTTP 请求都会创建一个新的实例,该实例仅在当前 HTTP Session 内有效。
1
2
3
4
5
@Bean
@Scope("singleton")
public Person personSingleton() {
return new Person();
}

@Value,@ConfigurationProperties

  1. @Value:注入普通类型的属性值,支持 SpEL 表达式。
  2. @ConfigurationProperties:注入配置文件中的属性值,支持 JSR303 数据校验,支持松散绑定。
1
2
3
4
5
6
7
8
9
10
person:
name: 张三
age: 18
boss: true
birth: 2021/08/03
maps: {k1: v1, k2: v2}
lists: [a, b, c]
dog:
name: 小狗
age: 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
@Value("${person.name}")
private String name;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boss;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
// 省略 getter/setter

public static class Dog {
private String name;
private Integer age;
// 省略 getter/setter
}

@ControllerAdvice,@ExceptionHandler,@RestControllerAdvice

  1. @ControllerAdvice:标注全局异常处理类,可以指定扫描范围。
  2. @ExceptionHandler:标注异常处理方法,可以指定处理的异常类型。
  3. @RestControllerAdvice:等价于@ControllerAdvice+@ResponseBody
1
2
3
4
5
6
7
8
9
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

@ExceptionHandler({ArithmeticException.class, NullPointerException.class})
public Result<String> handleArithmeticException(Exception e) {
return Result.error("exception");
}
}
1
2
3
4
5
6
7
8
@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler({ArithmeticException.class, NullPointerException.class})
public Result<String> handleArithmeticException(Exception e) {
return Result.error("exception");
}
}

@JsonIgnoreProperties,@JsonIgnore,@JsonFormat,@JsonUnwrapped,@JSONField

  1. @JsonIgnoreProperties:标注在类上,指定忽略的属性。
  2. @JsonIgnore:标注在属性上,指定忽略的属性。
  3. @JsonFormat:标注在属性上,指定日期格式。
  4. @JsonUnwrapped:标注在属性上,指定属性不包含在外层。
  5. @JSONField:标注在属性上,指定属性别名。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
@JsonIgnoreProperties({"name"})
private String password;
@JsonIgnore
private String address;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@JSONField(name = "phone")
private String myPhone;
@JsonUnwrapped
private UserDetail userDetail;
}

使用@JsonUnwrapped前

1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "张三",
"age": 18,
"password": "123456",
"address": "北京",
"phone": "123456789",
"createTime": "2021-08-03 11:00:00",
"userDetail": {
"phone": "123456789",
"email": ""
}
}

使用@JsonUnwrapped后

1
2
3
4
5
6
7
8
9
{
"name": "张三",
"age": 18,
"password": "123456",
"address": "北京",
"createTime": "2021-08-03 11:00:00",
"phone": "123456789",
"email": ""
}

@ActiveProfiles,@Test,@Transactional

  1. @ActiveProfiles:标注在测试类上,指定使用的配置文件。
  2. @Test:标注在测试方法上,指定测试方法。
  3. @Transactional:标注在测试方法上,被声明的测试方法的数据会回滚,避免污染测试数据。
1
2
3
4
5
6
7
8
9
10
11
12
@SpringBootTest
@ActiveProfiles("dev")
public class PersonTest {
@Autowired
private Person person;

@Test
@Transactional
public void test() {
System.out.println(person);
}
}

相关文章

MapStruct使用