欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring 依赖注入实现示例

程序员文章站 2022-04-22 09:30:10
【注】本文译自:  在本文中,我将向你展示如何在 spring framework 的依赖项注入中使用 project lombok 以获得最佳实践。  ...

【注】本文译自:

  在本文中,我将向你展示如何在 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 上找到。

以上就是spring 依赖注入实现示例的详细内容,更多关于spring 依赖注入的资料请关注其它相关文章!

相关标签: Spring 依赖注入