加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

使用 Spring Framework 时常犯的十大错误

发布时间:2019-07-29 17:22:21 所属栏目:移动互联 来源:锅外的大佬
导读:Spring 可以说是最风行的 Java 框架之一,也是一只必要顺从的强盛野兽。固然它的根基观念相等轻易把握,但成为一名强盛的 Spring 开拓者仍必要许多时刻和全力。 在本文中,我们将先容 Spring 中一些常见的错误,出格是面向 Web 应用措施和 Spring Boot。正

不管是桌面应用照旧 Web 应用,无论是 Spring 照旧 No Spring,多线程都是很难破解的。由并行执行措施所引起的题目是令人不寒而栗且难以捉摸的,并且经常难以调试 —— 现实上,因为题目的本质,一旦你意识到你正在处理赏罚一个并行执行题目,你也许就不得不完全放弃调试器了,并 “手动” 搜查代码,直到找到基础上的错误缘故起因。不幸的是,这类题目并没有如出一辙的办理方案;按照详细场景来评估环境,然后从你以为最好的角度来办理题目。

虽然,抱负环境下,你也但愿完全停止多线程错误。同样,不存在那种一刀切的要领,但这有一些调试和防备多线程错误的现实思量身分:

5.1. 停止全局状态

起首,紧记 “全局状态” 题目。假如你正建设一个多线程应用,那么应该亲近存眷任何也许全局修改的内容,假如也许的话,将他们所有删掉。假如某个全局变量有必需保持可修改的缘故起因,请细心行使 synchronization,并对措施机能举办跟踪,以确定没有由于新引入的守候时刻而导致体系机能低落。

5.2. 停止可变性

这点直接来自于 函数式编程,而且合用于 OOP,声明应该停止类和状态的改变。简而言之,这意味着放弃 setter 要领,并在全部模子类上拥有私有的 final 字段。它们的值独一产生变革的时刻是在结构时代。这样,你可以确定不会呈现争用题目,且会见工具属性将始终提供正确的值。

5.3. 记录要害数据

评估你的措施也许会在那里产生非常,并预先记录全部要害数据。假如产生错误,你将很兴奋可以获得信息声名收到了哪些哀求,并可更好地相识你的应用措施为什么会呈现错误。必要再次留意的是,日记记录引入了特另外文件 I/O,也许会严峻影相应用的机能,因此请不要滥用日记。

5.4. 复用现存实现

每当你必要建设本身的线程时(譬喻:向差异的处事发出异步哀求),复用现有的安详确现来取代建设本身的办理方案。这在很洪流平上意味着要行使 ExecutorServices 和 Java 8 简捷的函数式 CompletableFutures 来建设线程。Spring 还应承通过 DeferredResult 类来举办异步哀求处理赏罚。

6. 常见错误六:不行使基于注解的验证

假设我们之前的 TopTalent 处事必要一个端点来添加新的 TopTalent。另外,假设基于某些缘故起因,每个新名词都必要为 10 个字符长度。执行此操纵的一种要领也许如下:

  1. @RequestMapping("/put") 
  2. public void addTopTalent(@RequestBody TopTalentData topTalentData) { 
  3.  boolean nameNonExistentOrHasInvalidLength = 
  4.  Optional.ofNullable(topTalentData) 
  5.  .map(TopTalentData::getName) 
  6.  .map(name -> name.length() == 10) 
  7.  .orElse(true); 
  8.  if (nameNonExistentOrInvalidLength) { 
  9.  // throw some exception 
  10.  } 
  11.  topTalentService.addTopTalent(topTalentData); 
  12. }复制代码 

然而,上面的要领(除告终构很差以外)并不是一个真正 “干净” 的办理步伐。我们正搜查不止一种范例的有用性(即 TopTalentData 不得为空,TopTalentData.name 不得为空,且 TopTalentData.name 为 10 个字符长度),以及在数据无效时抛出非常。

通过在 Spring 中集成 Hibernate validator,数据校验可以更干净地举办。让我们起首重构 addTopTalent 要领来支持验证:

  1. @RequestMapping("/put") 
  2. public void addTopTalent(@Valid @NotNull @RequestBody TopTalentData topTalentData) { 
  3.  topTalentService.addTopTalent(topTalentData); 
  4. @ExceptionHandler 
  5. @ResponseStatus(HttpStatus.BAD_REQUEST) 
  6. public ErrorResponse handleInvalidTopTalentDataException(MethodArgumentNotValidException methodArgumentNotValidException) { 
  7.  // handle validation exception 
  8. }复制代码 

另外,我们还必需指出我们想要在 TopTalentData 类中验证什么属性:

  1. public class TopTalentData { 
  2.  @Length(min = 10, max = 10) 
  3.  @NotNull 
  4.  private String name; 
  5. }复制代码 

此刻,Spring 将在挪用要领之前拦截其哀求并对参数举办验证 —— 无需行使特另外手工测试。

另一种实现沟通成果的要领是建设我们本身的注解。固然你凡是只在必要超出 Hibernate的内置束缚集 时才行使自界说注解,本例中,我们假设 @Length 不存在。你可以建设两个特另外类来验证字符串长度,一个用于验证,一个用于对属性举办注解:

  1. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. @Constraint(validatedBy = { MyAnnotationValidator.class }) 
  5. public @interface MyAnnotation { 
  6.  String message() default "String length does not match expected"; 
  7.  Class<?>[] groups() default {}; 
  8.  Class<? extends Payload>[] payload() default {}; 
  9.  int value(); 
  10. @Component 
  11. public class MyAnnotationValidator implements ConstraintValidator<MyAnnotation, String> { 
  12.  private int expectedLength; 
  13.  @Override 
  14.  public void initialize(MyAnnotation myAnnotation) { 
  15.  this.expectedLength = myAnnotation.value(); 
  16.  } 
  17.  @Override 
  18.  public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
  19.  return s == null || s.length() == this.expectedLength; 
  20.  } 
  21. }复制代码 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读