Springboot一些常用注解

Springboot启动注解

@SpringbootApplication

这个注解是Springboot最核心的注解,用在Springboot的主类上,标识这是一个Springboot应用,用来开启Springboot的各项能力。实际上这个注解 @SpringbootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan。

@EnableAutoConfiguration

允许Springboot自动配置,帮助Springboot将所有符合条件的@Configuration配置都加载到Spring容器中。

@Configuration

@Configuration注解用于定义配置类,替换xml配置文件,被注解的类内部包含一个或多个被@Bean注解的方法。这些方法会被 AnnotationConfigApplicationContextAnnotationConfigWebApplicationContext 类进行扫描,并用于构建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;
}
posted @ 2022-06-26 21:23  ylyzty  阅读(95)  评论(0编辑  收藏  举报