1. @SpringBootApplication
这里先单独拎出@SpringBootApplication
注解说一下,虽然我们一般不会主动去使用它。
ps:这个注解是 Spring Boot 项目的基石,创建 SpringBoot 项目之后会默认在主类加上。
@SpringBootApplication
@RestController
public class SpringbootHelloApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootHelloApplication.class, args);
}
}
我们可以把
@SpringBootApplication
看作是@Configuration
、@EnableAutoConfiguration
、@ComponentScan
注解的集合。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
......
}
package org.springframework.boot;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
}
根据 SpringBoot 官网,这三个注解的作用分别是:
@EnableAutoConfiguration
:启用 SpringBoot 的自动配置机制@ComponentScan
:扫描被@Component
(@Repository
,@Service
,@Controller
)注解的 bean,注解默认会扫描该类所在的包下所有的类。@Configuration
:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
2. Spring Bean 相关
@Autowired
自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。
@Service
public class TestThread1 extends Thread{
...
}
@RestController
public class TestThread3 implements Runnable{
@Autowired
public TestThread1 testThread1;
}
@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
声明 Spring Bean 的作用域,使用方法:
@Bean
@Scope("singleton")
public Person personSingleton() {
return new Person();
}
@Configuration
一般用来声明配置类,可以使用 @Component
注解替代,不过使用@Configuration
注解声明配置类更加语义化。
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
}
3. 处理常见的 HTTP 请求类型
4 种常用的请求类型:
GET:请求从服务器获取特定资源。
/**
* 根据主键查询详情
*
* @param userId 主键
* @return 响应结果
*/
@GetMapping(value = "/{user_id}")
@Operation(summary = "根据主键查询详情", description = "根据主键查询详情")
public ApiResponse<UserResponse> queryById(@PathVariable(name = "user_id") Long userId) {
return userAppService.queryById(userId);
}
/**
* 分页查询
*
* @param pagination 分页
* @param queryRequest 查询对象
* @return 响应结果
*/
@GetMapping
@Operation(summary = "分页查询", description = "分页查询")
public ApiPageResponse<UserQueryResponse> query(@Valid Pagination pagination, @Valid UserQueryRequest queryRequest) {
return userAppService.query(pagination, queryRequest);
}
POST:在服务器上创建一个新的资源。
/**
* 创建
*
* @param createRequest 创建对象
* @return 响应结果
*/
@PostMapping
@Operation(summary = "创建", description = "创建")
public ApiResponse<Void> create(@RequestBody @Valid UserCreateRequest createRequest) {
return userAppService.create(createRequest);
}
PUT:更新服务器上的资源(客户端提供更新后的整个资源)
/**
* 根据主键更新
*
* @param userId 主键
* @param updateRequest 更新对象
* @return 响应结果
*/
@PutMapping(value = "/{user_id}")
@Operation(summary = "根据主键更新", description = "根据主键更新")
public ApiResponse<Void> updateById(@PathVariable(name = "user_id") Long userId,
@RequestBody @Valid UserUpdateRequest updateRequest) {
return userAppService.updateById(userId, updateRequest);
}
DELETE:从服务器删除特定的资源
/**
* 根据主键删除
*
* @param userId 主键
* @return 响应结果
*/
@DeleteMapping(value = "/{user_id}")
@Operation(summary = "根据主键删除", description = "根据主键删除")
public ApiResponse<Void> deleteById(@PathVariable(name = "user_id") Long userId) {
return userAppService.deleteById(userId);
}
4. 前后端传值
@PathVariable
和@RequestParam
public ApiResponse<UserResponse> queryByIdAndName(@PathVariable(name = "user_id") Long userId,
@RequestParam(value = "type", required = false) String name) {
return userAppService.queryByIdAndName(userId, name);
}
@RequestBody
@PutMapping(value = "/{user_id}")
@Operation(summary = "根据主键更新", description = "根据主键更新")
public ApiResponse<Void> updateById(@PathVariable(name = "user_id") Long userId,
@RequestBody @Valid UserUpdateRequest updateRequest) {
return userAppService.updateById(userId, updateRequest);
}
/**
* 更新请求对象
*
* @author sx
* @since 2023-12-15 13:39
*/
@Getter
@Setter
@ToString
@Schema(description = "更新请求对象")
public class UserUpdateRequest {
/**
* 名字
*/
@Schema(description = "名字")
private String name;
/**
* 性别(F女 M男)
*/
@Schema(description = "性别(F女 M男)")
private String sex;
}
ps:一个请求方法只可以有一个@RequestBody
,但是可以有多个@RequestParam
和@PathVariable
。 如果你的方法必须要用两个 @RequestBody
来接受数据的话,大概率是你的数据库设计或者系统设计出问题了!
5. 读取配置信息
我们的数据源application.yml
内容如下:
spring:
## 数据库配置
datasource:
## 数据源连接池类型
type: com.zaxxer.hikari.HikariDataSource
## 驱动
driver-class-name: com.mysql.cj.jdbc.Driver
## 连接url
url: jdbc:mysql://localhost:3306/sunxin?useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true&characterEncoding=utf-8&autoReconnect=true&useUnicode=true&allowMultiQueries=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
## 用户名
username: root
## 密码
password: 123456
## cloud 配置
cloud:
## nacos 配置
nacos:
## nacos 注册中心配置
discovery:
## 服务器地址
server-addr: 192.168.20.117:9140
## 命名空间ID
namespace: efffe014-28d3-422d-a286-1c2b941075f5
## mybatis-plus 配置
mybatis-plus:
## 数据库类型
db-type: mysql
elastic:
address: 192.168.20.119:9200
username:
password:
@Value
@Value("${elastic.address}")
private String address;
@ConfigurationProperties
6. 参数校验
@NotEmpty
被注释的字符串的不能为 null 也不能为空
@ApiModelProperty(value = "安全级别管理部门",required = true)
@NotEmpty(message = "安全级别管理部门不能为空")
private String manageDepartCode;
@NotBlank
被注释的字符串非 null,并且必须包含一个非空白字符
@NotBlank(message = "审核id不能为空")
@ApiModelProperty(value = "审核id")
private Integer id;
@Null
被注释的元素必须为 null
@NotNull
被注释的元素必须不为 null
@Min(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值
/**
* 页码
*/
@Min(1)
@ApiModelProperty(value = "页码")
private long pageNumber = 1L;
@Max(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=)
被注释的元素的大小必须在指定的范围内
7. 全局处理 Controller 层异常
@ControllerAdvice
:注解定义全局异常处理类@ExceptionHandler
:注解声明异常处理方法
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
/**
* 请求参数异常处理
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, HttpServletRequest request) {
......
}
}
8. 事务 @Transactional
@Transactional(rollbackFor = Exception.class)
//该注解一般可以作用在类或者方法上
public ApiResponse<Boolean> approve(Integer id) {
/**
* 安全等级审核通过后,
* 1. 安全级别更新
* 2. 定级规则更新
* 3. 生成资产定级任务(可前往资产定级任务列表查看)
*/
...
return ApiResponse.ok(Boolean.TRUE);
}