我正在尝试在运行时在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
}
}
我什么时候以及为什么要使用提供商?
答案 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.
}
}
}