Spring - 自动装配通用接口的通用实现

2023-12-01

我有一个小问题。这可能是微不足道的,但我以前从未遇到过。

我有通用接口和它的通用实现。我想自动装配它,但发生了错误。详细信息如下:

界面

@Service
public interface Serializing<T extends Serializable> {
    String serialize(T toBeSerialized);

    T deserialize(String toBeDeserialized, Class<T> resultType);
}

执行

@Service
public class JsonSerializer<T extends Serializable> implements Serializing<T> {
   /** code **/
}

自动装配尝试

private NoteDAO noteDAO;

@Qualifier("jsonSerializer")
private Serializing<UserComment> serializer;

@Autowired
public NoteController(NoteDAO noteDAO, Serializing<UserComment> serializer) {
    this.noteDAO = noteDAO;
    this.serializer = serializer;
}

Error

Parameter 1 of constructor in somepackagepath.NoteController required a bean of type 'anotherpackagepath.Serializing' that could not be found.

我想让它尽可能简单。我已经检查过网络,但我只发现了有关在配置中定义我的确切bean的信息。如果可能的话,我宁愿避免它。


In 您的具体情况,Spring 不允许使用泛型类型作为依赖项进行连接,例如:

@Autowired
public NoteController(NoteDAO noteDAO, Serializing<UserComment> serializer) {
    this.noteDAO = noteDAO;
    this.serializer = serializer;
}

原因很简单:一致性。
您创建 Spring bean 所用的依赖项@Service :

@Service
public class JsonSerializer<T extends Serializable> implements Serializing<T> {
   /** code **/
}

可以连接到其他 bean 中。

想象一下依赖于Serializing实例不使用相同的泛型:Serializing<UserComment> in Foo and Serializing<UserQuestion> in Bar例如 :

public class Foo{

    @Autowired
    public Foo(NoteDAO noteDAO, Serializing<UserComment> serializer) {
        this.noteDAO = noteDAO;
        this.serializer = serializer;
    }

}
public class Bar{

    @Autowired
    public Bar(NoteDAO noteDAO, Serializing<UserQuestion> serializer) {
        this.noteDAO = noteDAO;
        this.serializer = serializer;
    }

}

这里的Serializing对象是相同的,但每个 bean 都声明了一个不同的泛型。
所以它会破坏泛型类型的类型安全。


事实上,删除仿制药并不是真正的问题,因为Spring(从 Spring 4 开始)拥有一个能够解析类型的解析器 :

在幕后,新的 ResolvableType 类提供了以下逻辑: 实际上使用泛型类型。您可以自己轻松使用 导航并解析类型信息。 ResolvableType 上的大多数方法 本身会返回一个 ResolvableType

在 Spring 4 之前,您还可以使用其他解决方法来接受 bean 依赖项中的泛型类型。
真正的问题是你用注释了一个泛型类@Service使其成为一个 bean,同时它是必须配置为 bean 的通用类的实例。

因此,为了实现您想要做的事情,请声明JsonSerializer你想要实例化的bean@Configuration class :

@Configuration
public class SerializingBeans {

    @Bean
    public JsonSerializer<UserComment> userCommentSerializer() {
        return new JsonSerializer<UserComment>();
    }

    @Bean
    public JsonSerializer<UserAnswer> userAnswerSerializer() {
        return new JsonSerializer<UserAnswer>();
    }
}

您现在可以将依赖项连接为泛型类型:

@Service
public class NoteController {

    private Serializing<UserComment> userCommentSerializer;

    @Autowired
    public NoteController(Serializing<UserComment> serializer) {
        this.userCommentSerializer = serializer;

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

Spring - 自动装配通用接口的通用实现 的相关文章

随机推荐

  • 纯函数可以返回符号吗?

    这可能有点哲学性 但我认为这是提问的正确地点 假设我有一个创建 ID 列表的函数 这些标识符仅在应用程序内部使用 因此使用 ES2015 是可以接受的Symbol here 我的问题是 技术上 当您请求一个符号时 我想 JS 运行时会创建一
  • 在 Javascript 中查找字符串的所有小写和大写组合

    我正在找这个堆栈溢出问题用 Javascript 来回答 因此 如果我的输入是 word 该函数应该返回 单词 单词 单词 单词 单词 单词 ETC 这是我到目前为止所拥有的 但它只产生排列 不大写任何东西 var perm functio
  • Android 自定义日历视图禁用特定日期

    我是 Android 开发新手 开始开发一个预订应用程序 有一个日历视图 我想禁用该日历中的预订日期 我发现 Android 默认日历中没有禁用功能 那么您能帮我找到一个可以禁用特定日期的良好自定义日历视图吗 我需要资源或图书馆 谢谢你 在
  • 尝试在空对象上调用接口方法“android.media.session.ISessionController android.media.session.ISession.getController()”

    下面的代码是带有使用媒体会话的控件的音乐通知播放器 每当我单击通知中的控件时 它就会崩溃并出现上述错误 请参阅下面的代码 如果我错了 请纠正我 在下面的代码中 我使用媒体会话和广播接收器来构建通知 track 是我所有歌曲数据的模型类 tr
  • 当“display_errors”打开时,为什么此语法错误会返回 HTTP 错误 500?

    给定以下脚本 我得到了预期的 Notice Use of undefined constant error assumed error in htdocs test php on line 8 但如果我在脚本中添加一些东西 I get HT
  • NSXMLParser 从 XML 标签中检索错误数据

    我正在读取带有某些字段的 xml 例如
  • Python lambda 不接受元组参数[重复]

    这个问题在这里已经有答案了 我在两台 PC Linux 和 Windows 上运行带有 PyDev v2 6 插件的 Eclipse SDK v3 6 我想传递一个元组作为参数 例如 foo lambda x y y x print foo
  • Fancybox 导致 IE 加载速度缓慢?

    我正在使用 Fancybox v 1 3 4 在 iframe 中显示视频这一页 Fancybox 和视频显示良好 但问题是 自从添加代码后 我在 IE7 8 中加载网站时遇到了巨大的停顿 类似于这个问题 页面加载后 UI 冻结了 4 5
  • 从故障转储中获取 GDI 句柄计数的命令

    我有一个故障转储 我怀疑 GDI 泄漏是导致崩溃的原因 从完整的故障转储中是否可以找出我的进程崩溃时使用的 GDI 句柄的数量 我创建了一个 Windbg 脚本来转储 GDI 句柄表中的所有 GDI 句柄 看https aloiskraus
  • 构建 Logistic 回归模型时出现“检测到完美分离,结果不可用”

    作为我作业的一部分 我正在构建逻辑回归模型 但在构建模型时出现错误 检测到完美分离 结果不可用 X train year amt spnt rank 1 1 723034 0 418500 0 272727 2 0 716660 2 088
  • QTimer::timeout 没有触发

    我正在尝试创建一个在我的 Singleton 工作线程中每 n 秒触发一次的事件 信号 槽连接 信号是 QTimer 超时 槽是调用另一个 Singleton 类的 lambda 函数 无法正常工作 连接调用成功 计时器处于活动状态 并且我
  • 两列布局,左侧流体,右侧填充其余宽度

    我需要类似的东西this and this 但是我希望右列不是固定大小 而是可变大小 是否可以 some text stretch to fill the remaining space lt viewport 这是float解决方案 您可
  • Java 构造函数中的“this”

    嗯 这是一个非常基本的问题 我从来没有用java编写过代码 但我正在为朋友编写一个类 有类似的东西 class myClass private string name public string getName return this na
  • 如何通过php找到给定的十进制值的位数?

    我对php不太熟悉 但我知道我们可以通过php找到给定数字的位值 例如 如果输入为 23 56 则应回显 2 十 3 个 5 百分之一 6 千分之一 任何想法将不胜感激 请帮忙 Try str 23 56 strdiv explode st
  • Spark RDD:如何最有效地计算统计数据?

    假设存在类似于以下的元组 RDD key1 1 key3 9 key2 3 key1 4 key1 5 key3 2 key2 7 计算每个键对应的统计信息的最有效 并且理想情况下是分布式 的方法是什么 目前 我特别希望计算标准差 方差 据
  • 二维数组与一维数组的性能

    在 C 中 m n 二维数组与长度为 m n 的一维数组 对于 m 和 n 的较大值 之间在时间和空间上是否存在差异 使用一维数组访问元素会更快吗 在 C 中 二维数组只是一维数组的简洁索引方案 就像一维数组一样 二维数组分配单个连续内存块
  • 无法在 webview 上加载地理位置

    我想将地理位置加载到 android 2 1 上的 webview 中 地理定位在我的浏览器上运行良好 但在 webview 上却失败了 public class WebPageLoader extends Activity impleme
  • Pyspark:pandas_udf、grouped_agg 的多个参数

    我正在尝试应用带有两个参数的 pandas udf 但我有这个错误 首先我尝试使用一个参数 没问题 from pyspark sql functions import pandas udf PandasUDFType from pyspar
  • re.sub 中的 python 正则表达式条件 - 如何?

    是否可以使用python的正则表达式条件re sub 我尝试了多种变体但没有运气 这就是我所拥有的 import re match anything
  • Spring - 自动装配通用接口的通用实现

    我有一个小问题 这可能是微不足道的 但我以前从未遇到过 我有通用接口和它的通用实现 我想自动装配它 但发生了错误 详细信息如下 界面 Service public interface Serializing