SpringBoot注解篇


SpringBoot注解篇

@SpringBootApplication

@Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合

@EnableAutoConfiguration

启用 SpringBoot 的自动配置机制

@ComponentScan

扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类

@Configuration

允许在 Spring 上下文中注册额外的 bean 或导入其他配置类

@Component

通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。

@Repository

对应持久层即 Dao 层,主要用于数据库相关操作。

@Service

对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。

@Controller

对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面

@RestController

@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器
单独使用 @Controller 的话一般使用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况

@Scope

声明 Spring Bean 的作用域,使用方法:

@Bean
@Scope("singleton")
public Person personSingleton() {
...
}

四种常见的 Spring Bean 的作用域:
singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
prototype : 每次请求都会创建一个新的 bean 实例。
request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。

@PathVariable、@RequestParam

@PathVariable用于获取路径参数,@RequestParam用于获取查询参数,举例:

public List<Teacher> getKlassRelatedTeachers(
        @PathVariable("klassId") Long klassId,
        @RequestParam(value = "type", required = false) String type )

SpringBoot开启事务的支持

  1. 在main方法加上@EnableTransactionManagement注解:
    @SpringBootApplication
    @EnableTransactionManagement//开启事物的管理支持
    public class Application {
    
       public static void main(String[] args) {
           SpringApplication.run(Application.class, args);
       }
    
    }
  2. 在需要管理的方法上加上@Transactional注解:一般用在插入或者更新等方法上
    @Service
    public class DriverServiceImpl implements DriverService {
    
       @Autowired
       private DMMapper dmMapper;
    
       @Override
       @Transactional  //事物管理的方法,如果这个方法抛出异常,事务就会回滚
       public DM getDMById(Integer id) {
           return dmMapper.selectById(id);
       }
    
    }

@RequestBody

body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上
系统会使用HttpMessageConverter或者自定义的HttpMessageConverter将请求的 body 中的 json 字符串转换为 java 对象。

@value、@ConfigurationProperties

  1. 使用 @Value(“${property}”) 读取比较简单的配置信息:
    @Value("${wuhan2020}")
    String wuhan2020;
  2. 通过@ConfigurationProperties读取配置信息并与 bean 绑定:
    配置文件:
    library:
     location: 湖北武汉加油中国加油
     books:
       - name: 你的名字
        description: 描述
    
    读取:
    @Component
    @ConfigurationProperties(prefix = "library")
    class LibraryProperties {
       @NotEmpty
       private String location;
       private List<Book> books;
    
       @Setter
       @Getter
       @ToString
       static class Book {
           String name;
           String description;
       }
     省略getter/setter
     ......
    }

参数校验

@NotNull

@NotNull(message = "classId 不能为空")
   private String classId;
   @Size(max = 33)
   @NotNull(message = "name 不能为空")
private String name;

@Valid

@PostMapping("/person")
   public ResponseEntity<Person> getPerson(@RequestBody @Valid Person person) {
       return ResponseEntity.ok().body(person);

在类上加上 Validated 注解,这个参数可以告诉 Spring 去校验方法参数

全局处理 Controller 层异常

@ControllerAdvice :注解定义全局异常处理类
@ExceptionHandler :注解声明异常处理方法
举例:

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
   /**
    * 请求参数异常处理
    */
   @ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, 
HttpServletRequest request) {
	...
}

JPA

@Entity 声明一个类对应一个数据库实体。
@Table 设置表明
@Id 声明一个字段为主键
@GeneratedValue 指定主键生成策略
四种常见的主键生成策略
1.TABLE, 使用一个特定的数据库表格来保存主键
2.SEQUENCE,某些数据库中,不支持主键自增长,比如Oracle、PostgreSQL其提供了一种叫做”序列(sequence)”的机制生成主键
3.IDENTITY,主键自增长
4.AUTO把主键生成策略交给持久化引擎(persistence engine)(默认auto)

@Column(name = “user_name”, nullable = false, length=32)
设置属性 userName 对应的数据库字段名为 user_name,长度为 32,非空

@Transient 声明不需要与数据库映射的字段,在保存的时候不需要保存进数据库

json数据处理

@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析
举例:

@JsonIgnoreProperties({"userRoles"}
public class User {
   private String userName;
   private String fullName;
   private String password;
   @JsonIgnore
private List<UserRole> userRoles = new ArrayList<>();


@JsonFormat一般用来格式化 json 数据
举例:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone="GMT")
private Date date;


@JsonUnwrapped 扁平对象


  目录