Spring 依赖注入实现示例
【注】本文译自: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 上找到。
以上就是Spring 依赖注入实现示例的详细内容,更多关于Spring 依赖注入的资料请关注脚本之家其它相关文章!
- Spring入门配置和DL依赖注入实现图解
- spring依赖注入原理与用法实例分析
- 详解Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理
- Spring bean的实例化和IOC依赖注入详解
- SpringBoot的拦截器中依赖注入为null的解决方法
- 浅谈Spring IoC容器的依赖注入原理
- 理解Spring中的依赖注入和控制反转
- Spring依赖注入的三种方式实例详解
- Spring quartz Job依赖注入使用详解
- Spring依赖注入的三种方式小结
- 因Spring AOP导致@Autowired依赖注入失败的解决方法
- Spring依赖注入的两种方式(根据实例详解)
- Spring 依赖注入的几种方式详解
相关文章
基于Spring Security前后端分离的权限控制系统问题
本文给大家分享基于Spring Security前后端分离的权限控制系统问题,需要了解权限如何加载,权限匹配规则和登录的实现代码,对Spring Security权限控制系统相关知识感兴趣的朋友一起看看吧2021-06-06手把手带你掌握SpringBoot RabbitMQ延迟队列
RabbitMQ 是一个由Erlang语言开发的AMQP的开源实现,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗,下文将带你深入了解 RabbitMQ 延迟队列2021-09-09IDEA2020.1使用LeetCode插件运行并调试本地样例的方法详解
这篇文章主要介绍了IDEA2020.1使用LeetCode插件运行并调试本地样例的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2020-09-09
最新评论