使用 Spring 进行依赖注入的最佳实践

大家好我是易安,本篇文章我将向你展示如何使用Lombok来实现Spring框架中的最佳实践。

Spring框架本身提供了各种不同的方法来执行依赖注入。选项的灵活性是Spring框架的优势之一。但是,并非所有的依赖注入选项都被认为是最佳实践。有些选项实际上非常糟糕。

依赖注入示例

我设置了一些示例,以便我们审查可以使用的不同依赖注入选项。

让我们使用一个示例Spring服务。对于我们的目的,该服务具有返回字符串的一个方法。我们将使用Spring将我们的“服务”注入到一些伪控制器中。请记住,我们只是探索如何使用Spring框架进行依赖注入。

示例服务

@Service
public class MyService {

public String getHello(){

    return "Hello";

 }
}

我们的字段控制器有一个公共属性来保存该服务。我们可以注释此字段,Spring将注入服务实例。

属性注入

@Controller
public class FieldController {
@Autowired

MyService myService;

public String saySomething(){

    return myService.getHello();

 }
}

这只是一个公共属性,没有setter。很明显,这不是一个好习惯。也不是推荐的方法。

我们可以稍微改进一下,使字段访问变为私有的。Spring框架允许您自动装配私有字段。你确实会看到有人这样做。Spring会执行一些反射操作来实现依赖注入。

私有化

@Controller
public class PrivateFieldController {
@Autowired

private MyService myService;

public String saySomething(){

    return myService.getHello();

 }
}

虽然比仅使用私有字段好,但测试会变得麻烦。您要么需要启动Spring上下文,要么使用一些Spring实用程序来执行测试的依赖注入。虽然不是世界末日,但通常很烦人。

我们可以通过为私有属性提供setter方法来改进这一点。在面向对象编程中,Getter和Setter通常被视为最佳实践。通过对setter方法进行注释,可以轻松地指示Spring使用setter进行依赖注入。

方法注入

Setter控制器

@Controller

public class SetterController {
private MyService myService;

@Autowired

public void setMyService(MyService myService) {

    this.myService = myService;

}

public String saySomething(){

    return myService.getHello();

 }
}

这比使用私有字段要好得多。有人会抱怨这是要写太多代码了

依赖注入最佳实践

依赖注入的最佳实践是利用接口、构造函数和 final 属性。

我已经设置了一个“最佳实践”服务接口,并提供了一个带有 Spring Service 注释的服务实现。

最佳实践服务接口

public interface BpService {
    
    

    String getHello();
}

最佳实践服务实现

@Service
public class BpServiceImpl implements BpService {

    @Override
    public String getHello() {
        return "The Best Hello!";
    }
}

使用 Project Lombok

现在,使用 Lombok 实现依赖注入的最佳实践,我们需要:

  • 声明一个接口类型的 final 属性
  • 使用 Project Lombok 的 @RequiredArgsConstructor 注释标注类

现在,Project Lombok 将为所有声明为 final 的属性生成构造函数。Spring 将自动使用 Lombok 提供的构造函数进行自动装配。

Lombok 控制器

@RequiredArgsConstructor
@Controller
public class BpFinalConstructorController {

    private final BpService bpService;

    public String saySomething(){
        return bpService.getHello();
    }
}

这是一种非常不错的方式。您的代码会保持非常干净。在使用 Spring 时,通常需要多个自动装配的属性。

当您需要添加另一个 bean 时,只需声明一个 final 属性即可。

如果您进行了重构,不再需要一个由 Spring 管理的依赖项,只需删除 final 属性即可。

您不再需要维护 setter 或构造函数代码。Lombok 为您解决这个枯燥的任务。

我在日常编码中已经使用这种技术一段时间了。它确实节省了很多时间,并使代码更加清晰。不再存在未使用的属性和未使用的构造函数参数。现在重构就少了一些痛苦!

本文由 mdnice 多平台发布

猜你喜欢

转载自blog.csdn.net/qq_35030548/article/details/130151586