如何在Spring中以编程方式**配置JSR-330 @Provider和@Inject @Named("foo")String**?

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 3中注册字符串常量,以便@Named正确选择它?

axt*_*avt 6

简短的回答是:没有Spring的程序化配置.

尽管Spring和Guice都支持JSR-330 API并且Spring现在可以在没有XML的情况下进行配置,但它们的意识形态仍然非常不同.Spring依赖于静态配置,可以是XML文件的形式,也可以是带注释的Java类.因此,直接尝试将Guice风格的配置适应Spring可能会产生困难.

关于问题Provider- Spring不支持javax.inject.ProvidertoProvider()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)