提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
学习rabbitmq时发现很多注解看不懂,需要特地去查,于是在这里总结相关注解和其他应该会的。
做项目还没有做完,也写一些不懂的。
一、注解类
@FeignClient(value = "business")
springcloudAlibaba的openfeign接口,value填在springcloud中注册的服务,下面的接口方法则是需要调用的接口方法。
@Configuration
配置类需要的注解,像RedisTemplate、RabbitmqTemplate都需要这个注解
@Bean
将配置类的方法的返回值创建为spring容器中的bean,一般与@Configuration配合使用。
注: @Autowired是申请已存在的对象;@Component是加在类上,声明不属于@Service, @Repository, @Controller的组件
@Slf4j
可以调用log.info及其他日志方法,加在类上
@Autowired
将spring容器中的bean注入
@RestController、@Controller + @ResponseBody
目前我发现区别在于返回值是字符串时,两者都可以正常显示;但是如果单独的@Controller没有编写前端页面,返回字符串就会显示空页。
java
@GetMapping("/po")
public String po(){
long start = System.currentTimeMillis();
//1、调用库存服务扣除商品库存
itemStockClient.decr();
//2、调用订单服务,创建订单
orderManageClient.create();
System.out.println(end - start);
return "place order is ok!";
}
@GetMapping("/po")
接受对应的请求
@Mapper与@MapperScan(basePackages = "")
mapper接口上应该有@Mapper注解,或者在启动类上表明注解@MapperScan(basePackages = ""),写明mapper包所在位置
@SpringBootApplication
springboot的启动类
@EnableDiscoveryClient
nacos服务的注册,也在启动类上
@EnableFeignClients
openfeign中要调用其他服务的启动类上声明,被调用的不用声明
@RabbitListener(queues = )
标记一个方法作为消息监听器,当有消息到达指定队列时自动调用该方法
@Select、@Insert、@Update
mapper.xml的简略模式,直接把sql语句写在mapper接口中
@Transactional
spring中保证数据操作的ACID,全成功或者全部失败
@Resource
按名称或类型注入,比@Autowired更丰富一些,默认按名称注入。
@JsonFormat(pattern = "")
限制日期的格式,序列化与反序列化
@NotNull
字段不能为空
@DateTimeFormat(pattern = "")
前端传表单,用这个规定时间格式
@PathVariable(value="")
方法要从浏览器获得的请求参数
@Value
将配置的值注入管理的bean中
@RefreshScope
动态刷新配置,无需重启
@RequestMapping
Controller中类路径的地址
@Getter
Lombok中的方法,自动生产getter方法
@Data
自动生成所有字段的getter、setter、toString、equals、hashCode方法
@NotBlank(message ="")
验证字符串不能为null、不能为空字符串、不能只包含空白字符
@Range(min = , max = ,message = "")
限制数值的范围
@NoArgsConstructor、@AllArgsConstructor
无参构造和全参构造
@RequestBody
把请求体中的JSON/XML数据转换为Java对象
@RequestParam
是一个可选的参数,得到URL?后的参数并赋值给方法处理
二、独特写法
采用策略模式和责任链相结合:
写一个filter接口用作父接口,并定义一个方法:
java
public interface CheckFliter {
void check(StandardSubmit submit);
}
spring中 private Map<String, CheckFliter> checkFliterMap会自动得到接口的所有实现类。@Value会得到配置中filters的值,通过for循环自动执行每个filter中存在实现类的.check()方法,实现责任链,策略模式通过配置中注值来实现
java
@Component
@RefreshScope
public class CheckFilterContext {
@Autowired
private Map<String, CheckFliter> checkFliterMap;//自动得到所有实现类
@Value("${filters:apikey,ip,sign,template,mobile,fee}")
private String filters;
public void check(StandardSubmit submit) {
String[] filterArray = filters.split(",");
for (String filter : filterArray) {
CheckFliter checkFliter = checkFliterMap.get(filter);
checkFliter.check(submit);
}
}
}
每个具体的实现类,都有独特的实现方法
java
@Service(value = "apikey")
@Slf4j
public class ApiKeyCheckFilter implements CheckFliter {
@Autowired
private BeaconCacheClient beaconCacheClient;
@Override
public void check(StandardSubmit submit) {
log.info("接口模块-校验apikey");
Map clientBusiness=beaconCacheClient.hGetAll(CacheConstant.CLIENT_BUSINESS+submit.getApikey());
if (clientBusiness == null || clientBusiness.size() == 0){
log.info("【接口模块-校验apikey】 非法的apikey="+submit.getApikey());
throw new ApiException(ExceptionEnums.ERROR_APIKEY);
}
submit.setClientId(Long.parseLong(clientBusiness.get("id")+""));
log.info("【接口模块-校验apikey】 查询到用户信息 clientBusiness={}",clientBusiness);
}
}
2.java8的某个语法糖
java
void sadd(@PathVariable(value = "key")String key, @RequestBody Map<String,Object>... maps);
可以接收0个或多个Map,放在一个List[]数组中
总结
写了一部分,项目写完了再来补充