我们决定为我们未来的模块化工作使用带有 JSR-330 注释的依赖注入,并且对基于 Guice 2 SVN 的第一个可交付成果感到非常满意。
现在我们需要通过单元测试确保并记录我们需要的构造,当以编程方式配置时也可以在 Spring 中工作(我们希望与 Guice 相同的重构支持,因此没有 XML 文件)。我有问题,@Provider
但@Inject @Named("foo") String
我已经做了简单@Inject
的工作:
ApplicationContext ctx = new AnnotationConfigApplicationContext(LIBL_Object.class,
CORE_Provider.class);
this.object = ctx.getBean(LIBL_Object.class);
其中 LIBL_Object 是要注入的基类,但 CORE_Provider 没有像我希望的那样在 Spring 中注册。
CORE_Provider 的实现是
package qa.jsr330.core;
import javax.inject.Provider;
public class CORE_Provider implements Provider<ProvidedInterface> {
@Override
public ProvidedInterface get() {
return new CORE_Provided();
}
}
我想把它注入
package qa.jsr330.core;
import javax.inject.Inject;
public class LIBL_Object {
private ProvidedInterface provided;
public ProvidedInterface getProvided() {
return provided;
}
@Inject
public void setProvided(ProvidedInterface provided) {
this.provided = provided;
}
// Other stuff omitted.
}
我们还发现我们可以使用@Named 标签非常清楚地传递配置值。此代码如下所示:
String hostname;
@Inject
public void setHostname(@Named("as400.hostname") String hostname) {
this.hostname = hostname;
}
然后我们可以使用 Guice 注册这个字符串
bindConstant().annotatedWith(Names.named("as400.hostname")).to(value);
所以这两个问题是:
- 如何
@Provider
以编程方式向 Spring 3 注册课程? - 如何使用 Spring 3 注册一个字符串常量,以便 @Named 正确选择它?