常用注解记录

SpringBoot常用注解记录

相关内容参参考博文(原作者JavaGuide):https://zhuanlan.zhihu.com/p/135987318

  • @SpringBootApplication

  • Spring Bean相关

    • @Autowired
      自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。
    @Service
    public class UserService {
      ......
    }
    
    @RestController
    @RequestMapping("/users")
    public class UserController {
       @Autowired
       private UserService userService;
       ......
    }
    
    • @Component
      通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
    • @Repository
      对应持久层即 Dao 层,主要用于数据库相关操作。
    • @Service
      对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
    • @Controller
      对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。
    • @RestController
      @RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器。单独使用 @Controller 不加 @ResponseBody的话一般使用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。@Controller +@ResponseBody 返回 JSON 或 XML 形式数据
    • @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

    一般用来声明配置类,可以使用 @Component注解替代,不过使用Configuration注解声明配置类更加语义化。

    @Configuration
    public class AppConfig {
        @Bean
        public TransferService transferService() {
            return new TransferServiceImpl();
        }
    }
    
    • 处理常见的 HTTP 请求类型
      • GET
        请求从服务器获取特定资源。举个例子:GET /users(获取所有学生)
      • POST
        在服务器上创建一个新的资源。举个例子:POST /users(创建学生)
      • PUT
        更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /users/12(更新编号为 12 的学生)
      • DELETE
        从服务器删除特定的资源。举个例子:DELETE /users/12(删除编号为 12 的学生)
      • PATCH
        更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了。
    • 前后端传值
      • @PathVariable 和 @RequestParam
      • @RequestBody
    • 读取配置信息
      • @value(常用)
      • @ConfigurationProperties(常用)
      • PropertySource(不常用)
    • 参数校验(常用)
      • @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 被注释的元素必须是一个将来的日期
    • 验证请求体(RequestBody)
    • 验证请求参数(Path Variables 和 Request Parameters)--->也可以写@Valid注解
    • 全局处理 Controller 层异常
      • @ControllerAdvice :注解定义全局异常处理类
      • @ExceptionHandler :注解声明异常处理方法
    • JPA 相关
      • @Entity声明一个类对应一个数据库实体。

      • @Table 设置表名

      • 创建主键 @Id :声明一个字段为主键。

        • 通过 @GeneratedValue直接使用 JPA 内置提供的四种主键生成策略来指定主键生成策略。
        • 通过 @GenericGenerator声明一个主键策略,然后 @GeneratedValue使用这个策略
      • 设置字段类型

        • @Column 声明字段。
      • 指定不持久化特定字段

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

        • @Lob:声明某个字段为大字段。
          @Lob
            private String content;
        

        更详细的声明:

            @Lob
            //指定 Lob 类型数据的获取策略, FetchType.EAGER 表示非延迟 加载,而 FetchType. LAZY 表示延迟加载 ;
            @Basic(fetch = FetchType.EAGER)
            //columnDefinition 属性指定数据表对应的 Lob 字段类型
            @Column(name = "content", columnDefinition = "LONGTEXT NOT NULL")
            private String content;
        
      • 创建枚举类型的字段
        可以使用枚举类型的字段,不过枚举字段要用@Enumerated注解修饰。

        public enum Gender {
            MALE("男性"),
            FEMALE("女性");
        
            private String value;
            Gender(String str){
                value=str;
            }
        }
        
        @Entity
        @Table(name = "role")
        public class Role {
            @Id
            @GeneratedValue(strategy = GenerationType.IDENTITY)
            private Long id;
            private String name;
            private String description;
            @Enumerated(EnumType.STRING)
            private Gender gender;
            省略getter/setter......
        }
        
      • 增加审计功能

        只要继承了 AbstractAuditBase的类都会默认加上下面四个字段。

        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @MappedSuperclass
        @EntityListeners(value = AuditingEntityListener.class)
        public abstract class AbstractAuditBase {
        
            @CreatedDate
            @Column(updatable = false)
            @JsonIgnore
            private Instant createdAt;
        
            @LastModifiedDate
            @JsonIgnore
            private Instant updatedAt;
        
            @CreatedBy
            @Column(updatable = false)
            @JsonIgnore
            private String createdBy;
        
            @LastModifiedBy
            @JsonIgnore
            private String updatedBy;
        }
        

        我们对应的审计功能对应地配置类可能是下面这样的(Spring Security 项目):

        @Configuration
        @EnableJpaAuditing
        public class AuditSecurityConfiguration {
            @Bean
            AuditorAware auditorAware() {
                return () -> Optional.ofNullable(SecurityContextHolder.getContext())
                        .map(SecurityContext::getAuthentication)
                        .filter(Authentication::isAuthenticated)
                        .map(Authentication::getName);
            }
        }
        

        简单介绍一下上面设计到的一些注解:

        • @CreatedDate: 表示该字段为创建时间时间字段,在这个实体被 insert 的时候,会设置值
        • @CreatedBy :表示该字段为创建人,在这个实体被 insert 的时候,会设置值
        • @LastModifiedDate、@LastModifiedBy同理。
        • @EnableJpaAuditing:开启 JPA 审计功能。
      • 删除/修改数据

        • @Modifying 注解提示 JPA 该操作是修改操作,注意还要配合@Transactional注解使用。
        @Repository
        public interface UserRepository extends JpaRepository {
        
            @Modifying
            @Transactional(rollbackFor = Exception.class)
            void deleteByUserName(String userName);
        }
        
      • 关联关系

        • @OneToOne 声明一对一关系
        • @OneToMany 声明一对多关系
        • @ManyToOne声明多对一关系
        • MangToMang声明多对多关系
      • 事务 @Transactional
        @Transactional 注解一般用在可以作用在类或者方法上。

        • 作用于类:当把@Transactional 注解放在类上时,表示所有该类的public 方法都配置相同的事务属性信息。
        • 作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。
      • json 数据处理

        • 过滤 json 数据
          • @JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。
          • @JsonIgnore一般用于类的属性上,作用和上面的@JsonIgnoreProperties 一样。
        • 格式化 json 数据
          • @JsonFormat一般用来格式化 json 数据
        • 扁平化对象
          • 使用@JsonUnwrapped 扁平对象
        • 测试相关
          • @ActiveProfiles一般作用于测试类上, 用于声明生效的 Spring 配置文件
          • @Test声明一个方法为测试方法
          • @Transactional被声明的测试方法的数据会回滚,避免污染测试数据
          • @WithMockUser Spring Security 提供的,用来模拟一个真实用户,并且可以赋予权限

你可能感兴趣的:(常用注解记录)