# springboot 注解
# ConditionalOn 注解
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}")
只有当两个属性都为 true 的时候才加载。其中
:true 就是: 如果没有为该属性设置值,则为该属性设置默认值true, 其实这就是@Vaue 注解的规范,一切 SpEL 都可以应用在这里.
# ConditionalOnSingleCandidate
# ConditionalOnResource
ConditionalOnResource(resources="my.xml")
如果我们要加载的 bean 依赖指定资源是否存在于 classpath 中,那么我们就可以使用这个注解
# ConditionalOnJndi
# ConditionalOnJava
@ConditionalOnJava(JvaaVersion.EIGHT)
只有运行指定版本的 Java 才会加载 Bean
# ConditionalOnWebApplication 和 ConditionalOnNotWebApplication
# ConditionalOnCloudPlatform
# 组合条件
# 组合条件 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{}
}
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 {};
}
2
3
4
5
6
7
# @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 扁平对象之后