# springboot 注解

🐉 SpringBoot | 🐉 专题-注解

# ConditionalOn 注解

back

Spring Boot 对 @Conditional 注解为我们做了细化,这些注解(13个)都定义在 org.springframework.boot.autoconfigure.condition package 下,逐个打开这 13 个注解,我们发现这些注解上有相同的元注解

# ConditionalOnProperty

这个条件解释是: application.properties 或 application.yml 文件中

# ConditionalOnBean 和 ConditionalOnMissingBean

有时候我们需要某个 Bean 已经存在应用上下文时才会加载,与之相反,有时候我们需要某个 Bean 不存在于应用上下文时才会加载

# ConditionalOnExpression

@ConditionalOnExpression("${myBean.enable:true} and ${otherBean.enable:true}")
1

只有当两个属性都为 true 的时候才加载。其中 :true 就是: 如果没有为该属性设置值,则为该属性设置默认值true, 其实这就是@Vaue 注解的规范,一切 SpEL 都可以应用在这里.

# ConditionalOnSingleCandidate

# ConditionalOnResource

ConditionalOnResource(resources="my.xml")
1

如果我们要加载的 bean 依赖指定资源是否存在于 classpath 中,那么我们就可以使用这个注解

# ConditionalOnJndi

# ConditionalOnJava

@ConditionalOnJava(JvaaVersion.EIGHT)
1

只有运行指定版本的 Java 才会加载 Bean

# ConditionalOnWebApplication 和 ConditionalOnNotWebApplication

# ConditionalOnCloudPlatform

# 组合条件

back

# 组合条件 AND

我们只需要在类上使用多个@ConditionalOnXxxx 就可以了,当然也可以继承 AllNestedConditions类封装我们多个条件

其他 OR——>AnyNestedCondition,NONE——>NoneNestedConditions

public class OnJndiAndProperty extends AllNestedConditions {
    public OnJndiAndProperty() {
        super(ConfigurationPhase.PARSE_CONFIGURATION);
    }

    @ConditionalOnJndi()
    static class OnJndi{}

    @ConditionalOnProperty()
    static class OnProperty{}
}
1
2
3
4
5
6
7
8
9
10
11
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnJndiAndProperty.class)
public @interface OnConditionalJndiAndProperty {
    String[] value() default {};
}
1
2
3
4
5
6
7

参考别人的RabbitAutoConfiguration

# @SpringBootApplication

看作是 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合

  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
  • @ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。
  • @Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类

# Spring Bean 相关

# @Autowired

# @Component,@Repository,@Service, @Controller

  • @Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
  • @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。

# @RestController

@RestController 注解是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器

# @Scope

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

# @Configuration

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

# 处理常见的 HTTP 请求类型

种常见的请求类型:

  • 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)

# 前后端传值

# @PathVariable 和 @RequestParam

@PathVariable 用于获取路径参数,@RequestParam 用于获取查询参数。

# @RequestBody

@RequestBody

用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。
系统会使用HttpMessageConverter或者自定义的 HttpMessageConverter 将请求的 body 中的 json 字符串转换为 java 对象

一个请求方法只可以有一个@RequestBody,但是可以有多个@RequestParam 和@PathVariable

# 读取配置信息

# @value(常用)

# @ConfigurationProperties(常用)

# PropertySource(不常用)

@PropertySource 读取指定 properties 文件

# 参数校验

# 验证请求参数(Path Variables 和 Request Parameters)

一定一定不要忘记在类上加上 Validated 注解了

# 全局处理 Controller 层异常

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

# JPA 相关

# 创建表

  • @Entity 声明一个类对应一个数据库实体。
  • @Table 设置表明

# 创建主键

  • @Id :声明一个字段为主键。
  • 使用@Id 声明之后,我们还需要定义主键的生成策略。我们可以使用 @GeneratedValue 指定主键生成策略。

# 设置字段类型

  • @Column 声明字段

# 指定不持久化特定字段

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

# 声明大字段

  • @Lob:声明某个字段为大字段

# 创建枚举类型的字段

# 关联关系

# 事务 @Transactional

Exception 分为运行时异常 RuntimeException 和非运行时异常。
在@Transactional 注解中如果不配置 rollbackFor 属性,那么事物只会在遇到 RuntimeException 的时候才会回滚,加上 rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚。

@Transactional 注解一般用在可以作用在类或者方法上。

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

# json 数据处理

# 过滤 json 数据

  • @JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析
  • @JsonIgnore 一般用于类的属性上,作用和上面的@JsonIgnoreProperties 一样。

# 格式化 json 数据

  • @JsonFormat 一般用来格式化 json 数据

# 扁平化对象

  • @JsonUnwrapped 扁平对象之后