
架构狂人
2023/04/14阅读:18主题:橙心
使用 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 为您解决这个枯燥的任务。
我在日常编码中已经使用这种技术一段时间了。它确实节省了很多时间,并使代码更加清晰。不再存在未使用的属性和未使用的构造函数参数。现在重构就少了一些痛苦!
作者介绍

架构狂人
公众号【顶尖架构师栈】