javax.inject.Provider与字符串

时间:2019-05-28 14:37:16

标签: java code-injection provider

我正在尝试在运行时在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
     }    
}

我什么时候以及为什么要使用提供商?

2 个答案:

答案 0 :(得分:1)

 public Test(@Named("URL") String someUrl){

要调用此方法,someUrl必须已经解析并且可用(例如,对于容器)

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

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

答案 1 :(得分:0)

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

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.
    }
 }

}