Java程序员从Spring框架中学习到的三种最佳实践

毫无疑问,Spring框架是最流行的Java框架之一,通过提供依赖注入和控制反转等特性,可以轻松创建企业级Java应用程序。

但是,老实说,Spring不仅仅是另一个DI和IOC框架。通过提供一个有用的抽象层,它进一步简化了许多Java的api,例如JDBC、JMS、Java Mail等等。它们消除了Java开发人员在执行SQL语句和处理结果集以获得他们想要的Java对象时所面临的大部分困难。

因此,当您学习Spring时,不仅要学习如何使用它,还要学习如何用Java和面向对象方式编写更好的代码。

在这篇文章中,我将分享我在学习Spring过程中发现的一些最佳实践,主要是通过阅读Craig Walls的经典动作书籍《Spring In Action》和我自己在使用Spring过程中的体验。

这本书对我产生了巨大的影响,因为克雷格出色的写作风格,以及他解释Spring每一个概念的方式。如果你还没有读过它,我强烈建议你去读这本书——它完全值得你花费时间和金钱。

无论如何,在不浪费时间的情况下,以下是我学到的三种最佳实践,并建议每一个Java程序员在用Java编写代码时都要注意到这一点并加以应用。

1、Coding for Interfaces 面向接口的编程

这是我第一次读Head first Design Patterns时学到的一个老的OOP指导原则。这个OOP设计原则的主要目的是减少两个类之间的耦合,从而增加灵活性。

Spring严格遵循这个面向对象的指导方针,并且经常公开一个接口来使用关键类,例如创建JdbcOperation接口来利用JdbcTemplate。这种做法可以让不同层之间松散耦合。

另一个很好的例子是缓存接口,它用于提供缓存。所有其他的缓存实现,例如EhCache、ConcurrentMapCache和NoOpCache等,都实现了这个接口。

如果您的代码依赖于缓存接口而不依赖于任何特定的实现,那么您可以切换缓存提供者而不会影响代码的其他部分。

下面是使用集合框架为Java中的接口编写代码的简单示例。如果您仔细观察,在这个示例中,我使用了接口而不是实现来声明Java中的变量、参数和返回方法类型。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * Program to demonstrate coding for interfaces in Java
 * @author WINDOWS 8
 *
 */
public class Hello {
  public static void main(String args[]) {
    // Using interface as variable types
    List<String> rawMessage = Arrays.asList("one", "two", "three");
    List<String> allcaps = toCapitalCase(rawMessage);
    System.out.println(allcaps);
  }
  /**
   * Using Interface as type of argument and return type
   */
  public static List<String> toCapitalCase(List<String> messages) {
    return messages.stream()
                    .map(String::toUpperCase)
                    .collect(Collectors.toList());
  }
}

这种编码风格是灵活的,在将来更容易进行扩展。

2、偏爱unchecked的异常胜过checked异常

如果您已经使用了Spring框架,那么您就会注意到Spring更倾向于不检查的异常,而不是检查过的异常,最好的例子就是Spring JDBC。

Spring有丰富的异常层次结构来描述连接和从数据库检索数据时可以获得的不同错误,但是它们的根是DataAccessException,这是未检查的。

Spring认为,大多数错误都源于在catch块中无法纠正的原因,因此它将捕获异常的决定留给开发人员,而不是像Java那样强制他们进入异常。其结果是更简洁的代码,没有空的catch块——以及更少的try-catch块。

在处理Java中的错误和异常时,这也是最佳实践之一。如果您对这个主题感兴趣,那么您也可以查看我的post 10 Java Exception最佳实践以获得更多建议。

3、使用模板方法设计模式

Spring大量使用模板方法设计模式来简化事情。这方面的一个很好的例子是JdbcTemplate,它在使用JDBC API时省去了很多麻烦。您只需要定义它需要什么,Spring就会处理流程的其余部分。

如果您不知道,模板模式定义了一个流程或算法,在这个过程或算法中,您无法更改流程,但同时,您可以根据需要定制步骤。

例如,在处理JDBC时,可以使用JdbcTemplate来执行查询并获取所需的对象。您只需要提供SQL,它在每种情况下都是不同的,以及映射逻辑将一行从一个表映射到一个对象。

这里有一个很好的图表,很好地解释了模板模式。您可以看到,每个人都有一些共同的任务,但是他们做不同的工作,模板方法很好地捕捉到了这一点。他们所需要做的就是定义他们的工作,他们可以通过定义work()抽象方法来定义他们的工作。

除了JdbcTemplate之外,您还可以在Spring框架的API中找到许多模板方法模式的其他示例,例如JmsTemplate和RestTemplate,它们允许您使用Java应用程序中的REST API。

这就是您可以从Spring中学到的一些Java最佳实践。Spring是一个很棒的框架,其作者是经验丰富的Java开发人员。通过使用Spring以及查看它们的代码、所做的决策以及它们如何设计api,您可以学到很多东西。Spring是开源的,这意味着您可以下载并查看它们的源代码。

我知道Spring是许多这样的最佳实践的集合,有很多东西需要学习,但是我发现这三种方法在Spring中随处可见,这对Spring框架的代码质量产生了巨大的影响。

无论如何,如果您遇到了您从Spring中学到的其他最佳实践,请与我们分享。

原文发布于微信公众号 - 程序你好(codinghello)

原文发表时间:2018-06-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java3y

纳税服务系统七(投诉管理模块)【显示投诉信息、处理回复、我要投诉、Quartz自动受理、统计图FusionCharts】

投诉受理管理模块 接下来,就是来开发我们的投诉受理管理模块了…..我们来看看原型图与需求吧: 查询用户提交的投诉信息,可以根据投诉部门(部门A/B)、投诉时间段...

6167
来自专栏向治洪

Kotlin DSL详解

DSL简介 所谓DSL领域专用语言(Domain Specified Language/ DSL),其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖...

4147
来自专栏平凡文摘

成为java高级程序员需要掌握哪些

1823
来自专栏编程

Sprint测试交付物设计

交付物定义: 基于敏捷开发流程,每个Sprint周期交付内容应如下: Burndown Chat(燃尽图),例如下图所示: ? Smock Test(冒烟测试)...

2166
来自专栏海说

深入理解计算机系统(3.1)---走进汇编的世界

  本系列拖了蛮久了,主要是因为LZ写的时候其实刚看到第二章,因此这一段时间快速看了下第三章,并花了点时间沉淀了一下,这才耽误了下来。

973
来自专栏点滴积累

geotrellis使用(二十九)迁移geotrellis至1.1.1版

目录 前言 升级过程 总结 一、前言        由于忙着安装OpenStack等等各种事情,有半年的时间没有再亲密的接触geotrellis,甚至有半年的时...

3634
来自专栏A周立SpringCloud

Spring Cloud与Dubbo共存方案总结

一、背景 假设有一个遗留的Dubbo系统,现在想改用Spring Cloud。 由于遗留Dubbo系统比较庞大,短期之内无法完成技术栈的迁移。因此需要“分步走”...

4748
来自专栏海说

深入理解计算机系统(3.1)---走进汇编的世界

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer13.html

1033
来自专栏liulun

Nim教程【一】

这应该是国内第一个关于Nim入门的系列教程 什么是Nim 我们先来引述网友 Luikore的一段话: Nim 不是函数式的, 但 ...

4079
来自专栏一枝花算不算浪漫

购物车的原理及实现.(仿京东实现原理)

3945

扫码关注云+社区

领取腾讯云代金券