关于spring:Spring-依赖注入最佳实践

35次阅读

共计 2766 个字符,预计需要花费 7 分钟才能阅读完成。

【注】本文译自:https://springframework.guru/…

  在本文中,我将向你展现如何在 Spring Framework 的依赖项注入中应用 Project Lombok 以获得最佳实际。
  Spring 框架自身具备多种执行依赖项注入的形式。选项的灵活性是 Spring 框架的劣势。然而,并非所有的依赖项注入选项都被视为最佳实际。有些实际上不太好。

依赖注入示例

  我提供了一些设置示例,供咱们查看必须应用的各种依赖项注入选项。
  让咱们以 Spring Service 为例。就咱们的目标而言,该服务具备一种返回字符串的办法。咱们将应用“service”,并应用 Spring 将其注入一些模仿控制器中。请记住,咱们只是在摸索如何应用 Spring Framework 进行依赖项注入。

示例 Service

public class MyService {public String getHello(){return "Hello";}
}

  咱们的 Field 领有一项私有属性的服务。咱们能够注解该字段,Spring 将注入该服务的实例。

属性注入

Field Controller

@Controller
public class FieldController {
    @Autowired
    MyService myService;
    public String saySomething(){return myService.getHello();
    }
}

  这只是一个私有属性,没有 setter。显然,这不是一个好的实际,不举荐这样做。
  咱们能够对此进行一些改良,将该字段的拜访权限设为公有。Spring Framework 的确容许你主动拆卸公有字段。你的确看到有人这样做。Spring 将执行一些反射魔术来执行依赖项注入

公有 Field Controller

public class PrivateFieldController {
    @Autowired
    private MyService myService;
    public String saySomething(){return myService.getHello();
    }
}

  只管只应用公有字段比拟好,然而测试却成了一个令人头痛。你要么须要启动 Spring Context,要么应用一些 Spring 实用程序来执行依赖注入以进行测试。不是世界末日,但总的来说很烦人。
  咱们能够通过为公有属性提供 setter 来改善这一点。Getter 和 Setter 通常被认为是面向对象编程中的最佳实际。通过注解 setter 办法,批示 Spring 应用 setter 进行依赖项注入很简略。

办法注入

Setter Controller

@Controller
public class SetterController {
    private MyService myService;
    @Autowired
    public void setMyService(MyService myService) {this.myService = myService;}
    public String saySomething(){return myService.getHello();
    }
}

  这是应用公有字段时的显著改良。有人会埋怨这要写太多代码。然而实际上,自 South Park 的第一季以来,此类工作已在古代 IDE 中实现了自动化。

构造函数注入

  下一个选项是应用构造函数。到目前为止,这是咱们钻研过的最佳办法。应用构造函数设置注入的属性时,不用提供主动拆卸正文。这是一个很好的性能,能够节俭一些键入工夫。从 Spring Framework 版本 4.2 开始,用于依赖项注入的构造函数的正文是可选的。

Constructor Controller

@Controller
public class ConstructorController {
    private MyService myService;
    public ConstructorController(MyService myService) {this.myService = myService;}
    public String saySomething(){return myService.getHello();
    }
}

  基于构造函数的依赖注入无疑被认为是最佳实际。已经有一段时间我集体偏爱基于 setter 的注入,然而起初又转向基于构造函数的注入。
  咱们依然能够改善咱们的示例。当初有两个次要问题。第一,咱们的服务类型是具体类型。硬类型的依赖注入不是最佳实际。
  第二个问题是,咱们要注入的属性未声明为 final。因而,从实践上讲,该类能够在实例化注入的属性后对其进行批改。依# 赖注入最佳实际
  依赖项注入的最佳实际是利用接口,构造函数和 final 属性。
  我曾经设置了“最佳实际”服务接口,并提供了服务实现 — 应用了 Spring Service 注解。

最佳实际服务接口

public interface BpService {String getHello();
}

最佳实际服务实现

@Service
public class BpServiceImpl implements BpService {
    @Override
    public String getHello() {return "The Best Hello!";}
}

应用 Project Lombok

  当初,应用 Project Lombok 进行依赖注入的最佳实际的秘诀在于:

  • 申明一个 final 属性接口
  • 为类增加 Project Lomboc 注解 @RequiredArgsConstructor

  当初,Project Lombok 将为申明为 final 的所有属性生成一个构造函数。Spring 会主动应用 Lombok 提供的构造函数来主动拆卸该片段。

Lombok Controller

@RequiredArgsConstructor
@Controller
public class BpFinalConstructorController {
    private final BpService bpService;
    public String saySomething(){return bpService.getHello();
    }
}

  这是执行此操作的真正好办法。您的代码放弃十分洁净。应用 Spring 时,通常须要多个主动拆卸属性。
  当您须要增加另一个 bean 时,只需申明一个 final 属性。
  如果您重构并且不再须要 Spring 托管的依赖项,则只需删除 final 属性。
  你不再须要保护设置器或构造函数代码。Project Lombok 加重了您的日常工作。
  我在日常编码中始终应用这种技术。相对是节省时间。并导致更洁净的代码。未应用的属性和未应用的结构函数参数已一去不复返了。重构当初不那么苦楚了!
  本文的源代码可在 GitHub 上找到。

正文完
 0