我们可以把 @SpringBootApplication 看作是 @Configuration 、 @EnableAutoConfiguration 、 @ComponentScan 注解的集合。
@EnableAutoConfiguration :启用 SpringBoot 的自动配置机制 @ComponentScan : 扫描被 @Component ( @Service , @Controller )注解的 bean,注解默认会扫描该类所在的包下所有的类。 @Configuration :允许在 Spring 上下文中注册额外的 bean 或导入其他配置类 @Autowired 自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。
Component , @Repository , @Service , @Controller 我们一般使用 @Autowired 注解让 Spring 容器帮我们自动装配 bean。要想把类标识成可用于 @Autowired 注解自动装配的 bean 的类,可以采用以下注解实现:
@Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用 @Component 注解标注。 @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。 @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。 @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。 注:以上的功能一样,只是标注有意义。
@RestController @RestController 注解是 @Controller和 @ ResponseBody 的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器。
@Scope @Configuration 一般用来声明配置类,可以使用 @Component 注解替代,不过使用 Configuration 注解声明配置类更加语义化。
@GetMapping("/users")
@RequestMapping(value="/users",method=RequestMethod.GET)
复制代码
GET /users (获取所有学生) POST /users (创建学生) PUT /users/12 (更新编号为 12 的学生) DELETE /users/12 (删除编号为 12 的学生) @PathVariable 和 @RequestParam @PathVariable 用于获取路径参数, @RequestParam 用于获取查询参数。
@RequestBody 用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且 Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用 HttpMessageConverter 或者自定义的 HttpMessageConverter 将请求的 body 中的 json 字符串转换为 java 对象。
@value 使用 @Value("${property}") 读取比较简单的配置信息:
@ConfigurationProperties 通过 @ConfigurationProperties 读取配置信息并与 bean 绑定。
PropertySource @PropertySource 读取指定 properties 文件
注:读取配置文件的优先级
@NotEmpty @NotBlank @Null @NotNull @AssertTrue @AssertFalse @Pattern(regex=,flag=) @Email @Min(value) @Max(value) @DecimalMin(value) @DecimalMax(value) @Size(max=, min=) @Digits (integer, fraction) @Past @Future
我们在需要验证的参数上加上了 @Valid 注解,如果失败,它将抛出 MethodArgumentNotValidException
@Validated 注解了,这个参数可以告诉 Spring 去校验方法参数。 @ControllerAdvice @ExceptionHandler
@Entity 声明一个类对应一个数据库实体。
@Table 设置表名
@Id :声明一个字段为主键。
使用 @Id 声明之后,我们还需要定义主键的生成策略。我们可以使用 @GeneratedValue 指定主键生成策略。
/**
* 使用一个特定的数据库表格来保存主键
* 持久化引擎通过关系数据库的一张特定的表格来生成主键,
*/
TABLE,
/**
*在某些数据库中,不支持主键自增长,比如Oracle、PostgreSQL其提供了一种叫做"序列(sequence)"的机制生成主键
*/
SEQUENCE,
/**
* 主键自增长
*/
IDENTITY,
/**
*把主键生成策略交给持久化引擎(persistence engine),
*持久化引擎会根据数据库在以上三种主键生成 策略中选择其中一种
*/
AUTO(默认)
复制代码
@Column 声明字段。
@Transient :声明不需要与数据库映射的字段,在保存的时候不需要保存进数据库 。
@Lob :声明某个字段为大字段。
可以使用枚举类型的字段,不过枚举字段要用 @Enumerated 注解修饰。
@Modifying 注解提示 JPA 该操作是修改操作,注意还要配合 @Transactional 注解使用。
@OneToOne @OneToMany @ManyToOne MangToMang
@Transactional 在要开启事务的方法上使用 @Transactional 注解即可!
1、@Transactional 应用在非 public 修饰的方法上
2、@Transactional 注解属性 propagation 设置错误,若是错误的配置以下三种 propagation,事务将不会发生回滚。
TransactionDefinition.PROPAGATION_SUPPORTS
TransactionDefinition.PROPAGATION_NOT_SUPPORTED
TransactionDefinition.PROPAGATION_NEVER
3、@Transactional 注解属性 rollbackFor 设置错误
Spring默认 未检查 unchecked 异常(继承自 RuntimeException 的异常)或者 Error 才回滚事务
4、同一个类中方法调用,导致@Transactional失效
比如有一个类Test,它的A方法调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。
5、异常被你的 catch“吃了”导致@Transactional失效
6、数据库引擎不支持事务(myisam)
@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。 @JsonIgnore 一般用于类的属性上,作用和上面的 @JsonIgnoreProperties 一样。 @JsonFormat 一般用来格式化 json 数据。
使用 @JsonUnwrapped
@ActiveProfiles 一般作用于测试类上, 用于声明生效的 Spring 配置文件。 @Test 声明一个方法为测试方法 @Transactional 被声明的测试方法的数据会回滚,避免污染测试数据。 @WithMockUser Spring Security 提供的,用来模拟一个真实用户,并且可以赋予权限。