Springboot一些常用注解
Springboot启动注解
@SpringbootApplication
这个注解是Springboot最核心的注解,用在Springboot的主类上,标识这是一个Springboot应用,用来开启Springboot的各项能力。实际上这个注解 @SpringbootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan。
@EnableAutoConfiguration
允许Springboot自动配置,帮助Springboot将所有符合条件的@Configuration配置都加载到Spring容器中。
@Configuration
@Configuration注解用于定义配置类,替换xml配置文件,被注解的类内部包含一个或多个被@Bean注解的方法。这些方法会被
AnnotationConfigApplicationContext
或AnnotationConfigWebApplicationContext
类进行扫描,并用于构建bean定义,初始化Spring容器。
@SpringBootConfiguration
@SpringBootConfiguration继承自@Configuration,二者功能一致,标注当前类是配置类,并将类内声明的一个或多个@Bean注解标记的方法对应的实例加载到Spring容器中。
@ComponentScan
@ComponentScan注解默认会装配标识了@Controller,@Service,@Repository,@Component注解的类到Spring容器中。扫描路径可以通过value属性或basePackages属性配置。如果不指定扫描路径则默认从声明@ComponetScan所在类的包进行扫描。
Spring Bean相关注解
@Component, @Controller, @Service, @Repository
@Component: 通用的注解,可标注任意类为Spring组件
@Controller: 对应SpringMVC控制层,主要用于接受用户请求,并调用Service层返回数据给前端
@Service: 对应Service层,主要是一些逻辑功能的实现,并调用DAO层接口
@Repository: 对应DAO层,主要用于操作数据库
@RestController
@RestController = @Controller + @ResponseBody,表示这是一个控制器Bean,并返回JSON或XML格式数据(对应前后端分离的情况)。
@Bean
@Bean明确地指示了方法产生一个bean实例,并交给Spring容器管理。
@Bean
@Scope("singleton")
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Scope
@Scope用于声明Spring Bean的作用域。
- singletion: 单例(默认情况)
- prototype: 每次请求创建一个新的实例
- request: 每一次HTTP请求产生一个新的实例,该实例仅在当前HTTP request内有效
- session: 每一个HTTP Session会产生一个新的实例,该实例仅在当前HTTP Session内有效
@Autowired
@Autowired自动注入对象到类中。
注入方式:
- 构造器注入(推荐)
优点:保证依赖不为空,强依赖处理(编译阶段即可发现);避免了循环依赖;提升代码可复用性
缺点:注入参数较多时,代码臃肿不友好 - Field注入
优点:代码少,简洁明了
缺点:容易出现空指针异常,Field注入允许构建对象实例的时候依赖的实例对象为空,直到调用该实例才能发现 - Setter注入
优点:相比构造注入,Setter注入类似于选择注入;允许在类构造完成后重新注入
# Field注入
public class UmsAdminController {
@Autowired
private UmsAdminService umsAdminService;
}
# 构造器注入
public class UmsAdminController {
private UmsAdminService umsAdminService;
@Autowired
public UmsAdminController(UmsAdminService umsAdminService) {
this.umsAdminService = umsAdminService;
}
}
# Setter注入
public class UmsAdminController {
private UmsAdminService umsAdminService;
@Autowired
public void setAdminController(UmsAdminService umsAdminService) {
this.umsAdminService = umsAdminService;
}
}
HTTP请求相关注解
HTTP的请求类型:
- GET: 从服务器获取资源
- POST: 在服务器创建一个新的资源
- PUT: 更新服务器上的资源(全量更新,由客户端提供更新后的整个资源)
- DELETE: 从服务器删除资源
- PATCH: 更新服务器上的资源(增量更新,客户端提供更改的属性,使用较少)
@GetMapping
@GetMapping = @RequestMappig(method=RequestMethod.GET)
@PostMapping
@PostMapping= @RequestMappig(method=RequestMethod.POST)
@PutMapping
@PutMapping= @RequestMappig(method=RequestMethod.PUT)
@DeleteMapping
@DeleteMapping= @RequestMappig(method=RequestMethod.DELETE)
@PathVariable
获取路径参数。
@RequestMapping(value = "/permission/{adminId}", method = RequestMethod.GET)
@ResponseBody
public CommonResult<List<UmsPermission>> getPermissionList(@PathVariable Long adminId) {
List<UmsPermission> permissionList = umsAdminService.getAllPermission(adminId);
return CommonResult.success(permissionList);
}
可以从请求的url中获取adminId。
@RequestParam
获取请求参数。
@RequestMapping(value = "/delete/batch", method = RequestMethod.DELETE)
@ResponseBody
public CommonResult<Object> delete(@RequestParam("ids") List<Long> ids) {
esProductService.delete(ids);
return CommonResult.success(null);
}
RequestParam会跟在url的 ?
之后。
@RequestBody
读取Request请求的body部分,并且Content-Type为application/json格式,接收到数据之后会自动将数据绑定到Java对象。
@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody
public CommonResult login(@RequestBody UmsAdminLoginParam umsAdminLoginParam, BindingResult result) {
String token = umsAdminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword());
if (token == null) {
return CommonResult.validateFailed("用户名或密码错误");
}
Map<String, String> tokenMap = new HashMap<>();
tokenMap.put("tokenHead", tokenHead);
tokenMap.put("token", token);
return CommonResult.success(tokenMap);
}
public class UmsAdminLoginParam {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在RequestBody中发送JSON数据,后端可以把JSON数据映射到UmsAdminLoginParam类实例上。
总结:一个请求方法只能有一个@RequestBody,可以有多个@RequestParam和@PathVariable。
读取配置信息相关注解
@Value
读取简单配置信息。
# application.yml
jwt:
field: Authorization
secret: mySecret
expiration: 604800
tokenHead: Bearer
@Component
public class JwtTokenUtil {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private Long expiration;
}
@ConfigurationProperties
@ConfigurationProperties有一个
prefix
属性,通过指定前缀来绑定配置文件中的配置信息。
使用方式:
- 作用于类上
- 作用于方法上:该方法需要有@Bean注解且所属类有@Configuration注解
spring:
datasource:
url: jdbc:mysql://localhost:3306/mall-learning?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: "0926"
// 作用于类上
@ConfigurationProperties(prefix = "spring.datasource")
@Component
@Getter
@Setter
public class Datasource {
private String url;
private String username;
private String password;
}
// 作用于方法上
@Configuration
public class DatasourceConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public Datasource datasource() {
return new Datasource();
}
}
public class ConfigurationPropertiesController {
@Autowired
private Datasource datasource;
}
这种绑定对象的方式是隐式绑定的,即配置文件中的字段除 prefix
后的名称需要与类中对应相同。
@PropertySource
@PropertySource读取指定 properties 文件。
# jwt.properties
jwt.field: Authorization
jwt.secret: mySecret
jwt.expiration: 604800
jwt.tokenHead: Bearer
@Component
@PeopertySource(name = "classpath:jwt.properties")
public class JwtTokenUtil {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private Long expiration;
}