Spring:具有自动装配依赖项的通用类

2024-03-28

我有一个标准的 Spring Boot MVC 应用程序,其中包含许多实体以及相应的存储库和服务。组件之间共享许多基础设施,因此我想将其抽象为通用类。我目前正在尝试实现这一目标的方式是这样的(仅显示传达想法的框架):

interface AbstractRepository<T> {
    fun findById(entityId: Long): T 
}

abstract class AbstractEntityService<T>(
  private val entityRepository: AbstractRepository<T>,
) {

  fun getEntity(entityId: Long): T = entityRepository.findById(entityId)
}

@Repository
interface MyRepository : AbstractRepository<MyEntity>

@Service
class MyEntityService(
  myRepository: MyRepository,
  /* some other dependencies */
) : AbstractEntityService<MyEntity>(myRepository) {
  /* some additional methods */
}

这似乎有效,即我可以实例化(或自动装配)MyEntityService。但请注意,我必须通过MyRepository显式地传递给构造函数,而不是让 Spring 自动装配它。由于运行时类型擦除,这是不可能的。但到目前为止,这并没有给我带来太多困扰。

当我想添加一些逻辑时出现问题AbstractEntityService这需要一些其他豆子,即类似这样的东西

@Service
abstract class AbstractEntityService<T>(
  private val entityRepository: AbstractRepository<T>,
) {
  
  @Autowired
  private lateinit var otherService: OtherService

  fun getEntity(entityId: Long): T

  fun commonMethodUsingOtherService(): T
}

但现在我有一个问题,因为为了自动装配OtherService我必须使我的抽象服务成为 Spring 组件(@Service)这会对 Spring 尝试注入带来不必要的副作用AbstractRepository<T>在我的构造函数中声明。由于上面提到的类型擦除,它发现了很多豆子AbstractRepository类型并失败。

我的问题:我怎样才能说服Spring不要将bean注入到我的AbstractEntityService构造函数?

相关问题:对于我的问题(在第一段中提到)是否有技术上不同的解决方案来避免可能的框架限制/缺点? IE。不使用继承,以不同的方式构建我的代码等。


这可以通过替换现场注入来轻松解决AbstractEntityService使用构造函数注入,并删除@Service注解:

abstract class AbstractEntityService<T>(
    private val entityRepository: AbstractRepository<T>,
    private val otherService: OtherService,
) {
    ...
}

现在,如果这个类不是抽象的,它的依赖项可以由 Spring 注入,至少与定义中的一样好otherService是一个字段。但这个定义更好,因为您现在还可以将依赖项从子类传递到此类中,如下所示:

@Service
class MyEntityService(
    myRepository: MyRepository,
    otherService: OtherService,
    /* some other dependencies */
) : AbstractEntityService<MyEntity>(myRepository, otherService) {
    /* some additional methods */
}

我不太清楚你的意思为什么MyRepository由于类型擦除而无法自动连接,我想问题中缺少一些细节。

如果问题是您有不同类型的组件MyRepository在您的应用程序上下文中,您可以使用以下方式注释其中之一@Primary这使得 Spring 在必须自动装配单个候选者时选择该组件。

另一种方法可能是给你的 bean 一个名字,然后限定你的依赖关系MyEntityService:

@Repository("myrepo")
open class MyRepository : AbstractRepository<MyEntity> {
   ...
}

@Service
class MyEntityService(
    @Qualifier("myrepo")
    myRepository: AbstractRepository<MyEntity>,
    otherService: OtherService,
    /* some other dependencies */
) : AbstractEntityService<MyEntity>(myRepository, otherService) {
    /* some additional methods */
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring:具有自动装配依赖项的通用类 的相关文章

  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 如何在 JPQL 或 HQL 中进行限制查询?

    在 Hibernate 3 中 有没有办法在 HQL 中执行相当于以下 MySQL 限制的操作 select from a table order by a table column desc limit 0 20 如果可能的话 我不想使用
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • 更新到 Kotlin 1.3.30 后出现“未解析的引用:Parcelize”

    我使用 Kotlin 1 3 21 很长时间了kotlin android extensions插件长期处于实验模式 今天我通过升级版本切换到 Kotlin 1 3 30 现在无论我使用什么 Parcelize注释我看到错误 Unresol
  • java inputstream 打印控制台内容

    sock new Socket www google com 80 out new BufferedOutputStream sock getOutputStream in new BufferedInputStream sock getI
  • 如何在spring mvc框架中运行后台进程

    我有一个网络应用程序 使用 spring mvc 框架 它使得以下内容 用户将文件上传到服务器 立即进入成功页面 使用该文件运行后台进程 那么 我如何使用 spring mvc 框架来做到这一点呢 先感谢您 使用异步标记方法 你在这里有例子
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • AngularJS - 服务、工厂、过滤器等中的依赖注入

    因此 我想在我的 Angular 应用程序中使用一些插件和库 目前 我只是引用这些函数 方法 因为它们是在 99 的应用程序中以完全忽略依赖注入的方式使用的 我有 例如 javascript 库 MomentJS 它处理格式化和验证日期 并
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • hibernate 6.0.2.Final 和 spring boot 2.7.0 的entityManagerFactory bean 未配置问题

    所以最近我想升级我的 Spring Boot 项目项目的一些依赖项 特别是这些组件 雅加达 EE 9 弹簧靴2 7 休眠 6 0 2 Final 完成此操作后 所有更新和代码折射 更新将 javax 导入到 jakarta 以及一些 hib
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • java XMLSerializer 避免复杂的空元素

    我有这个代码 DocumentBuilderFactory factory DocumentBuilderFactory newInstance DocumentBuilder builder factory newDocumentBuil
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack

随机推荐

  • jQuery 包装集中元素的顺序是否始终与元素在标记中出现的顺序匹配?

    jQuery 包装集中元素的顺序是否保证与元素在标记中出现的顺序相匹配 我问这个问题是因为我需要对一组嵌套元素执行操作 并且我需要始终按照嵌套顺序执行操作 我可以使用以下命令运行该操作吗 each 匹配集上的迭代器并始终获得正确的顺序 或者
  • 有选择地禁用 swaggerUI 中的“尝试一下”

    尽管这里对该主题进行了很长的讨论 https github com swagger api swagger ui issues 156 https github com swagger api swagger ui issues 156 我
  • 等待页面加载

    我正在尝试创建一个等待页面加载的方法javascript 但我有一个错误 可能我没有正确使用该方法 public static void WaitForLoad this IWebDriver driver int timeoutSec 1
  • 为什么 JavaScript 中“0 === -0”为真?

    在最近的一篇文章中http wtfjs com http wtfjs com 一位作者在没有解释的情况下写了以下内容 这恰好是真实的 0 0 returns true 我对 运算符的理解是 如果操作数指向同一个对象 它会返回 true 此外
  • 迭代时从地图(或任何其他 STL 容器)中擦除/删除内容

    据称 当迭代器变得无效时 您不能在迭代时删除 删除容器中的元素 删除满足特定条件的元素的 安全 方法是什么 请只使用 stl 不要使用 boost 或 tr1 EDIT如果我想删除满足特定条件的多个元素 是否有更优雅的方法 也许使用函子和
  • 将带有 html 扩展名的文件重定向到不带扩展名的文件(在 url 中)

    我最近使用 htaccess 更改了我的网站网址 这样我的网址就不会显示文件扩展名 现在我的问题是我创建了一个新的 xml 站点地图 这样我的 url 将是无扩展名的 Google 网站管理员工具告诉我有关重复内容的问题 IE page 和
  • 如何将 IntentService 的结果返回到 Activity 中?

    我正在使用 IntentService 通过 JSON 处理与服务器的网络通信 JSON 服务器部分工作正常 但我无法将结果返回到需要的地方 以下代码显示了我如何从 onClick 内部启动意图服务 然后让该服务更新全局变量以将结果转发回主
  • 使用 powershell 对整个目录进行 MD5 校验和哈希

    我正在尝试使用 powershell 为整个目录生成 MD5 校验和 在 Linux 上 有一个非常有效的 1 liner 如下所示 tar cf 某个目录 md5和 我了解到 tar 现在是 Windows 10 的一部分 并且可以在 P
  • Ruby on Rails 中的 Gemfile 和 Gemfile.lock 有什么区别

    我是 Ruby on Rails 的初学者 我正在使用 Rails 3 0 9 有什么区别Gemfile and Gemfile lock在 Rails 中 The Gemfile是您指定要使用哪些 gem 的地方 并允许您指定哪些版本 T
  • 获取未安装字体的字体和 Windows 名称

    有人可以告诉我如何获得字体的字体名称吗 我如何获取具有字体名称的字体的 Windows 名称 例如 arialblackno1 ttf 其字体为 arialblack 但我希望获取未安装的字体的字体名称 它只是在一个文件夹中 您在评论中说您
  • C#属性和ref参数,为什么没有糖?

    我刚刚在 C 中工作时遇到了此错误消息 属性或索引器不能作为 out 或 ref 参数传递 我知道导致此问题的原因 并快速解决了创建正确类型的局部变量 并将其作为函数调用的问题out ref参数 然后将其分配回属性 RefFn ref ob
  • 为什么嵌套的 HTML 元素会让我的 CSS 跳转?

    这是一个谜题 基本页面 一个元素 http jsfiddle net PZj6t http jsfiddle net PZj6t HTML div div CSS body html height 100 margin 0 padding
  • 使用 COMMAw,d 转换数字

    我正在关注SAS 帮助页面 http support sas com documentation cdl en lrdict 64316 HTML default viewer htm a000200667 htm并试图获得与页面底部示例相
  • 测试 post 请求时 Django 消息中间件问题

    我正在尝试测试一个 UpdateView 它将一条消息添加到重定向的成功页面 看来我的问题来自messages因为 pytest 返回 django contrib messages api MessageFailure 如果不安装 dja
  • 计算文件中的字长

    所以我的函数应该打开一个文件并计算字长并给出输出 例如 许多 样本 txt 字长1 2 长度为 2 的单词 6 长度为 3 的单词 7 长度为 4 的单词 6 我的sample txt 文件包含 这是一个测试文件 1 个字的长度是多少 长度
  • 将 ProcessStartInfo.WorkingDirectory 设置为 UNC 路径

    我有一个用 VB net 编写的实用程序 它作为计划任务运行 它在内部调用另一个可执行文件 并且必须访问映射驱动器 显然 Windows 在用户未登录时访问映射驱动器的计划任务存在问题 即使向任务本身提供了身份验证凭据也是如此 好的 为了解
  • document.querySelector 获取包含括号的类名

    我正在编写的软件必须与我无法控制的第三方网络应用程序的 dom 配合使用 有些类名带有参数 例如class view box 200px 我猜这些类名是 Sass Less mixins arguments document querySe
  • 按文本而不是值对 Datagridview 的列进行排序

    我的 datagridview 中有一个列是组合框列 我希望它按其显示值 即文本 而不是其值 在本例中为数据库中的 int 列表 排序 我怎样才能做到这一点 您可以通过覆盖来做到这一点SortCompare事件于DataGridView w
  • Google App-Gmail 无法设置。通过 swiftmailer SMTP 传输 (PHP) 发送时 Gmail 替换地址

    您好 感谢您提前提供的任何帮助 我正在使用 swiftmailer SMTP 传输方法从我的 PHP 脚本发送电子邮件 发送消息就好了 有用 问题是 无论我将 FROM REPLYTO SENDER 设置为什么 电子邮件都会作为 GMAIL
  • Spring:具有自动装配依赖项的通用类

    我有一个标准的 Spring Boot MVC 应用程序 其中包含许多实体以及相应的存储库和服务 组件之间共享许多基础设施 因此我想将其抽象为通用类 我目前正在尝试实现这一目标的方式是这样的 仅显示传达想法的框架 interface Abs