Tho*_*sen 10 java spring jsr330
我们决定将依赖注入和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);
Run Code Online (Sandbox Code Playgroud)
其中LIBL_Object是被注入的基类成,但正如我在Spring希望CORE_Provider不登记.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望它注入
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.
}
Run Code Online (Sandbox Code Playgroud)
我们还发现,我们可以使用@Named标记非常清楚地传递配置值.此代码如下所示:
String hostname;
@Inject
public void setHostname(@Named("as400.hostname") String hostname) {
this.hostname = hostname;
}
Run Code Online (Sandbox Code Playgroud)
然后,我们可以使用Guice注册此字符串
bindConstant().annotatedWith(Names.named("as400.hostname")).to(value);
Run Code Online (Sandbox Code Playgroud)
所以这两个问题是:
@Provider以编程方式在Spring 3中注册该类?简短的回答是:没有Spring的程序化配置.
尽管Spring和Guice都支持JSR-330 API并且Spring现在可以在没有XML的情况下进行配置,但它们的意识形态仍然非常不同.Spring依赖于静态配置,可以是XML文件的形式,也可以是带注释的Java类.因此,直接尝试将Guice风格的配置适应Spring可能会产生困难.
关于问题Provider- Spring不支持javax.inject.Provider与toProvider()Guice中的绑定相同(顺便说一句,这种用法Provider没有在JSR-330文档中指定).因此,例如,可能需要一些特定于Spring的注释
@Configuration
public class CORE_Provider implements Provider<ProvidedInterface> {
@Override @Bean
public ProvidedInterface get() {
return new CORE_Provided();
}
}
Run Code Online (Sandbox Code Playgroud)
由于Spring配置的静态特性,来自外部的绑定值可能是困难的.例如,在您的情况下,它可以这样做:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(IBL_Object.class);
ctx.register(CORE_Provider.class);
ctx.registerBeanDefinition("as400.hostname",
BeanDefinitionBuilder.rootBeanDefinition(String.class)
.addConstructorArgValue(value).getBeanDefinition());
ctx.refresh();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8670 次 |
| 最近记录: |