【问题标题】:Configure auto-wired service injection with "code"使用“代码”配置自动连接服务注入
【发布时间】:2018-12-25 06:23:28
【问题描述】:

我已经发布了a similar question,但我需要用一个例子来详细说明以获得有用的答案。

我不确定如何使用 Spring Boot 定义一个特定的类实例,Spring 应该使用该实例将其注入到 @Autowired 依赖字段/构造函数中。

假设我有一个位于库中的实用程序类,我要么 a) 无权更改,要么 b) 不想添加对 Spring Boot 的依赖。

SecurityUtil -- 接受两个可能来自某些应用程序级配置(在外部包中定义)的字符串参数。

public class SecurityUtil {
    private final String algorithm;
    private final String key;

    public SecurityUtil(String algorithm, String key) {
        // ...
    }
}

PasswordHelper -- 使用SecurityUtil 对密码进行签名(例如)。

public class PasswordHelper {
    private final SecurityUtil securityUtil;

    @Autowired
    public PasswordHelper(SecurityUtil securityUtil) {
        // ...
    }
}

在应用程序启动期间,我希望能够使用在我的应用程序配置(或其他地方)中定义的算法和密钥创建SecurityUtil 的单例实例。我假设我可以添加一个类似于下面的类,但我不确定如何配置我的单例的注入。

DIConfig -- 为 DI 配置东西(例如

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DIConfig
{
    @Value("${security-util.key}")
    private String securityUtilKey;

    @Value("${security-util.algorithm}")
    private String securityUtilAlgorithm;

    public void configure(SpringDiMagicalConfig config)
    {
        // register a singleton SecurityUtil instance
        config.register(new SecurityUtil(securityUtilKey, securityUtilAlgorithm));
    }
}

如何使用 Java / Spring Boot 完成此配置?

【问题讨论】:

    标签: java spring spring-boot dependency-injection configuration


    【解决方案1】:

    configure 方法替换为:

    @Bean
    public SecurityUtil securityUtil()
    {
        return new SecurityUtil(securityUtilKey, securityUtilAlgorithm);
    }
    

    【讨论】:

      【解决方案2】:

      你可以这样走:

      @Component
      public class DiConfig {
      
          @Bean
          public SecurityUtil securityUtil(
                  @Value("${security-util.key}") String securityUtilKey,
                  @Value("${security-util.algorithm}") String securityUtilAlgorithm) {
              return new SecurityUtil(securityUtilKey, securityUtilAlgorithm);
          }
      }
      

      【讨论】:

      • 谢谢。应用该更改后,应用程序将无法启动并出现以下错误。我认为这是配置事物的顺序问题:“LifecycleProcessor 未初始化 - 在通过上下文调用生命周期方法之前调用‘刷新’:org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext”
      • @JoshM。您能否用您的更改和完整的堆栈跟踪更新您的问题,请
      • 我的错误,我将注入的 (@Value) 变量混淆了——将默认值应用于错误的变量,而将另一个变量排除在配置之外。所以真正的例外是没有为这些变量之一找到配置条目。
      猜你喜欢
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      相关资源
      最近更新 更多