程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Spring Boot 根据外部库的自定义注解动态提供String Beans大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Spring Boot 根据外部库的自定义注解动态提供String Beans?

开发过程中遇到Spring Boot 根据外部库的自定义注解动态提供String Beans的问题如何解决?下面主要结合日常开发的经验,给出你关于Spring Boot 根据外部库的自定义注解动态提供String Beans的解决方法建议,希望对你解决Spring Boot 根据外部库的自定义注解动态提供String Beans有所启发或帮助;

背景:假设我正在将代码从旧代码迁移到 Spring Boot 2 应用程序。 旧代码有自己的 IoC 机制,我想在新的 Spring 应用程序中重用旧库,而无需修改库代码库。

库代码仅使用字段注入。它使用类似于 @Value 的注解来注入一些属性,比如 @InjectString。此外,每个字段顶部也有 @Inject 注释。所以我想使用的所有库都或多或少是这样的

package com.mylibrary;

public class libraryA {

    @Inject
    @InjectString("db.propertIEs.poolEnabled")
    private String poolEnabled;
...

假设

@H_404_20@
  • db.propertIEs.poolEnabled 等所有属性都已存在于 System.getPropertIEs() 中。
  • libraryA 类已经在 Spring IoC 控制之下,只是缺少必需的字段 bean:
  • No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifIEs as autowire candIDate. Dependency Annotations: {@javax.inject.Inject(),@com.mylibrary.InjectString(name="db.propertIEs.poolEnabled")}
    

    问题: 如何重用旧代码并让 Spring 知道根据 @Inject 名称(可以从 @InjectString 检索?

    )将哪些值动态放入带有 System.getProperty 的字段中

    我在虑 3 个可能的解决方案:

    1. 在bean构建过程中,让Spring知道当它在寻找一个String类型的Bean并且该字段有@InjectString注解时,它可以从System.getproperty()中获取一个值作为bean值.

    2. 在类扫描期间,使用 @InjectString 获取所有字段并以某种方式在那里附加一个 @Value 注释,也许 Spring 会知道在那里插入什么

    3. 扫描所有用 @InjectString 注释的字段,为所有字段创建名为 bean 的 String 并将 @resource(name="...") 附加到每个字段 bean 声明

    哪个想法听起来最好,哪些 Spring 类将有助于实现?

    到目前为止,我可能更喜欢解决方案 1),因为它听起来像是一个单一的 Spring 类覆盖。 在解决方案 2) 和 3) 中,我缺少可以在 IoC 构建期间覆盖以动态提供额外 bean 定义的 Spring 类 - 您知道我可以使用什么吗?

    感谢您的任何提示!

    解决方法

    查看 @Value javadoc,我们会看到提示,处理在 AutowiredAnnotationBeanPostProcessor 中完成,绑定在 AutowireCandidateResolver 中完成。

    因此,我会尝试注册额外的 BeanPostProcessor,让您将 @InjectString 设置为 autowiredAnnotationTypes。 然后使用此注释注册 QualifierAnnotationAutowireCandidateResolver

    大佬总结

    以上是大佬教程为你收集整理的Spring Boot 根据外部库的自定义注解动态提供String Beans全部内容,希望文章能够帮你解决Spring Boot 根据外部库的自定义注解动态提供String Beans所遇到的程序开发问题。

    如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
    如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。