【问题标题】:javax.inject.Provider vs Stringjavax.inject.Provider 与字符串
【发布时间】:2019-10-14 02:59:50
【问题描述】:

我试图在运行时检索 web 应用程序中的一组 JNDI 密钥。 代码如下:

class Test{
    private final String someUrl;

    public Test(@Named("URL") String someUrl){
    // do something
    }

     public void dotEST( string someUrl){
      String x = someUrl;
      //some other logic
     }

}

我想了解使用上面的代码和这个的区别:

class Test{
    private final Provider<String> someUrl;

    public Test(@Named("URL") Provider<String> someUrl){
    // do something
    }

     public void dotEST( Provider<String> someUrl){
      String x = someUrl.get();
      //some other logic
     }    
}

何时以及为什么应该使用提供程序?

【问题讨论】:

    标签: java code-injection provider


    【解决方案1】:
     public Test(@Named("URL") String someUrl){
    

    要调用这个方法,someUrl 必须已经被解析并且可用(例如容器)

    public Test(@Named("URL") Provider<String> someUrl){
    

    在这里,检索可以推迟(甚至不完成)——它类似于延迟初始化。这取决于Provider 接口的实现。

    【讨论】:

      【解决方案2】:

      如果值计算复杂或昂贵,我会使用提供程序。也许您会提供到数据库的连接,或者获取一些远程配置值。

      KISS - 使用注入框架时,保持简单、愚蠢是关键。你越能依赖简单的东西(比如类型)越好。它会很快变成一团难以摆脱的烂摊子。

      即使@Named(...) 也很复杂,所以如果可能的话,我也会避免这种情况。从长远来看,为该字符串值设置一个占位符类可能会更容易(而不是更简单??)。

      class UrlToTheServer {
          private final String url;
      }
      
      ...
      
      class Test{
          private final String someUrl;
      
          @Inject
          public Test(UrlToTheServer urlToTheServer){
              someUrl = urlToTheServer.url;
          }
      
          public void foo() {
             // access someUrl here.
          }
       }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-30
        • 2013-12-04
        • 2020-09-30
        • 2010-09-12
        • 1970-01-01
        相关资源
        最近更新 更多