关于Spring依赖注入简洁方式的探索

        最近在项目开发过程中关注到一个依赖注入的写法差异,因为本人代码上有点强迫症,看到这种不同人不一样的写法,特意了解了一下,但是依然有部分疑惑未解。

        两种写法:(就是传说中最常见的属性注入和构造函数注入)

@Service
public class ContactCodeInfoService {
    @Autowired
    private ContactCodeInfoMapper contactCodeInfoMapper;
    @Autowired
    private CorpStaffMapper corpStaffMapper;

    、、、、、
}
@Service
public class CrAppService {
    private final CrAppRepository crAppRepository;

    public CrAppService(CrAppRepository crAppRepository) {
        this.crAppRepository = crAppRepository;
    }

    、、、、、
}

Spring官方推荐的是构造函数,并不推荐属性注入的方式

不推荐使用属性注入的理由的却很充分。 但是当采用构造函数注入会遇到代码很不简洁的问题,一旦需要注入的属性达到了四五个,整个构造函数就会显得很臃肿。

@Service
public class SiteCheckServiceImpl implements SiteCheckService {

    private final SitePageSpiderService sitePageSpiderService;
    private final SitePageAnalyzeService sitePageAnalyzeService;
    private final CheckService checkService;
    private final LogEventPublisher processLogEventPublisher;

    
    public SiteCheckServiceImpl(SitePageSpiderService sitePageSpiderService,
                                SitePageAnalyzeService sitePageAnalyzeService,
                                CheckService checkService,
                                LogEventPublisher processLogEventPublisher) {
        this.sitePageSpiderService = sitePageSpiderService;
        this.sitePageAnalyzeService = sitePageAnalyzeService;
        this.checkService = checkService;
        this.processLogEventPublisher = processLogEventPublisher;
    }
    
    、、、、、、
}

遇到这个问题又继续查略一些资料,结果表示可以通过lombok的@AllArgsConstructor来简化代码,让代码看起来比较整洁

@Service
@AllArgsConstructor
public class SiteCheckServiceImpl implements SiteCheckService {

    private final SitePageSpiderService sitePageSpiderService;
    private final SitePageAnalyzeService sitePageAnalyzeService;
    private final CheckService checkService;
    private final LogEventPublisher processLogEventPublisher;

    、、、、、
}

这样看起来也确实简洁了很多,但是当遇到有继承的情况下,就显得有些顾此失彼了

public abstract class BaseCheckProviderFactory {
    private final ProviderLimitStatus<String> providerLimitStatus;
    private final ProviderStrategy<ProviderBean> providerStrategy;
    private final Map<String, RateLimiter> providerRateLimiterMap;
    private final AppConfigService appConfigService;

    public BaseCheckProviderFactory(ProviderLimitStatus<String> providerLimitStatus,
                                    ProviderStrategy<ProviderBean> providerStrategy,
                                    Map<String, RateLimiter> providerRateLimiterMap,
                                    AppConfigService appConfigService) {
        this.providerLimitStatus = providerLimitStatus;
        this.providerStrategy = providerStrategy;
        this.providerRateLimiterMap = providerRateLimiterMap;
        this.appConfigService = appConfigService;
    }

    、、、、、、
}
@Component
public class TextCheckProviderFactory extends BaseCheckProviderFactory<TextCheckRequest, TextCheckResponse> {

    private final CheckLibraryService<TextCheckRequest, TextCheckResponse> textCheckLibraryService;

    
    public TextCheckProviderFactory(ProviderLimitStatus<String> providerLimitStatus,
                                    ProviderStrategy<ProviderBean> providerStrategy,
                                    Map<String, RateLimiter> providerRateLimiterMap,
                                    AppConfigService appConfigService,
                                    CheckLibraryService<TextCheckRequest, TextCheckResponse> textCheckLibraryService) {

        super(providerLimitStatus, providerStrategy, providerRateLimiterMap, appConfigService);
        this.textCheckLibraryService = textCheckLibraryService;
    }
    、、、、、、
}

这里有几种加lombok的方式:

1、父类和子类都加上@AllArgsConstructor,但是子类的构造函数要求父类需要有个无参构造函数

2、父类和子类都加上@AllArgsConstructor,同时父类加上@NoArgsConstructor,但是会出现父类的final属性没有在无参构造时没有初始化的问题。

后续的探索持续跟进中。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/444080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云打印机多少钱一台?

随着新的一年的开始&#xff0c;很多同学们都开始打印资料&#xff0c;以应对新一年的各种考试。但是对于学生们来说&#xff0c;去打印店打印价格贵、打印不方便、没时间去打印等多种原因导致我们没办法及时打印资料&#xff0c;这个时候我们就需要用到云打印机。那么云打印机…

浅谈游戏AI LOD的智能控制——LOD交易员

前引 LOD的概念 提到 细节层次 &#xff08;Level of Details&#xff0c;简写LOD&#xff09;&#xff0c;大家可能首先会想到图像渲染&#xff0c;像游戏中大地图的3D物体会随玩家与其距离的远近而变化精度&#xff08;主要是模型面数的变化&#xff0c;有时还会直接剔除&a…

CSS基础知识

font-family: "Trebuchet MS", Verdana, sans-serif; 字体栈&#xff0c;浏览器会一个一个试过去看下哪个可以用 font-size16px; font-size1em; font-size100%;//相对于16px 字体大小&#xff0c;需要进行单位换算16px1em font-weightnormal;//400font-weight属性…

ai直播数字人:AI大模型应用开发的神奇世界

当AI技术的发展走向一个新的高峰&#xff0c;AI直播数字人逐渐成为人们关注的焦点。这种全新的数字人形态&#xff0c;通过大模型应用开发&#xff0c;带来了一个神奇世界。 在这个神奇世界里&#xff0c;AI直播数字人可以展现出与真实人类相媲美的外貌和声音。通过先进的图像…

HarmonyOS ArkTS工程目录结构(Stage模型)

1. ArkTS工程目录结构&#xff08;Stage模型&#xff09; 官方文档&#xff08;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/start-with-ets-stage-0000001477980905-V2&#xff09; 1.1. AppScope AppScope > app.json5&#xff1a;应用的全局配…

图的单源最短路径问题

目录 一、简述 二、前置配置 三、迪杰斯特拉算法 四、改进的迪杰斯特拉算法 五、贝尔曼福特算法 一、简述 图是一种比较常用的数据结构&#xff0c;将问题转换成图相关的思路也是比较常用的。 图的单源最短路径问题&#xff0c;也就是图中某一个节点到图中其他节点的最短路…

基于SSM的植物园管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 开发技术简介 3 1.1 SSM框架 3 1.2 JSON 3 1.3 Ajax 4 1.4 Bootstrap前台框架 4 1.5 Eclipse 4 1.6 本章小结 4 2 系统分析 5 2.1可行性分析 5 2.1.1 技术可行性 5 2.1.2 经济可行性 5 2.1.3 操作可行性 5 2.2 功能需求 5 2.3 用例分析 6…

洞悉 Kubernetes 高阶奥秘:掌控资源、网络、存储,玩转容器化应用!

昨天我们已经入门了K8S&#xff0c;今天带大家学习一下资源、网络、存储这几个进阶的知识点模块内容。这几天陆陆续续会把K8S从头到尾讲一遍&#xff0c;最后会带大家实战一下&#xff0c;下面就开始今天的学习吧。 高级资源和控制器 Kubernetes 提供了一系列高级资源和控制器…

请编程输出无向无权图各个顶点的度 ← 链式前向星存图

【题目描述】请利用链式前向星存图&#xff0c;编程输出无向无权图各个顶点的度。【输入样例】 5 6 1 3 2 1 1 4 2 3 3 4 5 1【输出样例】 4 2 3 2 1【算法分析】 本例需要用到基于链式前向星的广度优先搜索&#xff08;BFS&#xff09;。 链式前向星广度优先搜索&#xff08;B…

JavaScript 实现飞机大战

文章目录 一些关键点概览&#xff1a;核心模块的具体实现示例&#xff1a;飞机类&#xff08;Plane&#xff09;的基本结构&#xff1a;子弹类&#xff08;Bullet&#xff09;的基本结构&#xff1a;敌机类&#xff08;Enemy&#xff09;的基本结构&#xff1a; 基于前面定义的…

Idea创建Maven项目

Maven安装配置步骤&#xff1a; 解压安装 bin目录 &#xff1a; 存放的是可执行命令。&#xff08;mvn 命令重点关注&#xff09; conf目录 &#xff1a;存放Maven的配置文件。&#xff08;settings.xml配置文件后期需要修改&#xff09; lib目录 &#xff1a;存放Maven依赖的j…

Python快速入门系列-2(Python的安装与环境设置)

第二章&#xff1a;Python的安装与环境设置 2.1 Python的下载与安装2.1.1 访问Python官网2.1.2 安装Python对于Windows用户对于macOS用户对于Linux用户 2.2 集成开发环境&#xff08;IDE&#xff09;的选择与设置2.2.1 PyCharm2.2.2 Visual Studio Code2.2.3 Jupyter Notebook2…

bat文件给多个Android设备安装apk

本文是安装一个apk 1、确保以下3个文件在同一个目录下 1>要安装的apk&#xff0c;这里是mmb.apk 2>设备名单&#xff0c;保存在.txt文件中&#xff0c;一行一个设备名&#xff0c;设备名通过adb devices获取&#xff0c;截图中是两个设备 txt文件中的样式 3>要运行…

基于springboot实现大学外卖管理系统项目【项目源码+论文说明】

基于springboot实现大学外卖管理系统演示 摘要 如今&#xff0c;信息化不断的高速发展&#xff0c;社会也跟着不断进步&#xff0c;现今的社会&#xff0c;各种工作都离不开信息化技术&#xff0c;更离不开电脑的管理。信息化技术也越来越渗透到各小型的企业和公司中&#xff…

AI 资讯 | GPT-4 时代终结!Claude 3 一举成为地表最强 AI 模型,今天就能用上!

AI 的飞速发展&#xff0c;对开发者而言意义重大。为此&#xff0c;我们精心筛选了最新 AI 相关资讯与大家分享交流。 未来&#xff0c;Apifox 也将时刻关注 AI 领域发展动态&#xff0c;及时呈现全面的 AI 资讯&#xff0c;与大家一起把握 AI 机遇。希望 在这些资讯中&#xf…

3.9Code

基于顺序存储结构的图书信息表的图书去重 #include<iostream> #include<stdlib.h> #include<string.h>typedef int status;#define OK 1using namespace std;typedef struct{char no[50];char name[50];float price; }Book;typedef struct{Book* elem;int …

J8 - Inception v1算法

目录 理论知识Inception卷积计算 模型结构模型实现inception 结构GoogLeNet模型打印模型结构 模型效果总结与心得体会 理论知识 GoogLeNet首次出现就在2014年的ILSVRC比赛中获得冠军&#xff0c;最初的版本为InceptionV1。共有22层深&#xff0c;参数量5M。 可以达到同时期VGG…

【C++进阶】哈希的应用 --- 布隆过滤器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

申请公众号上限是多少

一般可以申请多少个公众号&#xff1f;公众号申请限额在过去几年内的经历了很多变化。对公众号申请限额进行调整是出于多种原因&#xff0c;确保公众号内容的质量和合规性。企业公众号的申请数量从50个到5个最后到2个&#xff0c;对于新媒体公司来说&#xff0c;这导致做不了公…

七、软考-系统架构设计师笔记-数据库设计基础知识

1、数据库基础概念 数据库基本概念 数据(Data)数据库(Database)数据库管理系统(DBMS)数据库系统(DBS) 1.数据(Data) 是数据库中存储的基本对象&#xff0c;是描述事物的符号记录。 数据的种类&#xff1a; 文本、图形、图像、音频、视频等。 2.数据库(Database, DB) 数据库…