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开启事务的支持
- 在main方法加上@EnableTransactionManagement注解:
@SpringBootApplication @EnableTransactionManagement//开启事物的管理支持 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
- 在需要管理的方法上加上@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
- 使用 @Value(“${property}”) 读取比较简单的配置信息:
@Value("${wuhan2020}") String wuhan2020;
- 通过@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 扁平对象