Spring中的Guice Provider等价物

5

Guice的Provider在Spring中等效是什么?

这里是我需要用Spring替换的Guice代码:

public class MyProxyProvider implements Provider<MyProxy> {

    @Inject
    Config config;

    @Override
    public MyProxy get() {
        return new MyProxy(httpsclient, config.server, config.user, config.password, config.version);
    }

}

绑定定义于此:

public class MyModule implements Module {

    @Override
    public void configure(Binder g) {
        g.bind(MyProxy.class).toProvider(MyProxyProvider.class);
    }

}

最终,我的目标是通过以下方式将 @Autowired 用于代理对象:
public class ConnectionTest {

    @Autowired
    MyProxy proxy;
}

此外,请注意,MyProxy类位于外部的jar文件中,无法进行修改。
2个回答

6
在Spring中,与Guice的Provider相对应的是FactoryBean
根据文档:

FactoryBean接口是Spring IoC容器实例化逻辑的可插拔点。如果您拥有更好用Java表达而不是(可能)冗长的XML的复杂初始化代码,您可以创建自己的FactoryBean,在该类中编写复杂的初始化代码,然后将您的自定义FactoryBean插入到容器中。

示例
public class MyFactoryBean implements FactoryBean<MyClassInterface> {

    @Override
    public MyClassInterface getObject() throws Exception {
        return new MyClassImplementation();
    }

    @Override
    public Class<?> getObjectType() {
        return MyClassInterface.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

}

当你需要使用外部库和复杂的对象创建时,这是一种很好的方法,可以避免长时间的XML配置来设置你的bean。

为了在你的上下文中使用它,你只需像普通bean一样在你的上下文XML中提供它,例如:

...
<bean id="myClass" class="foo.bar.MyFactoryBean" />
...

但是,如果您的bean实例化非常简单(没有很多依赖关系),您可以直接在上下文XML中设置它,例如:

<bean id="myClass" class="foo.bar.MyClassImplementation" />

替代方案

如果您使用的是Spring 3,您可以编写一个配置类(带有@Configuration注解的类),如此文档所述。采用这种方法,您可以执行以下操作:

@Configuration
public class MyConfiguration {

    @Bean
    public MyClassInterface getMyClass() {
        return new MyClassImplementation();
    }

}

这样可以将您的实例添加到Spring上下文中,并使其在其他类中自动装配。但需要进行一些配置,根据提供的文档非常容易。

1
3.14同一文档:“除非您有充分的理由不这样做,否则请使用ApplicationContext。” FactoryBean主要用于向后兼容。 - oe.elvik
FactoryBeanBeanFactory是两个不同的东西 ;) BeanFactory在第3.8.3节中。 - Francisco Spaeth
@Java-Mentor。我按照您的示例创建了MyFactoryBean类,该类实现了*FactoryBean<MyProxy>*接口。此外,我添加了<bean id="proxy" class="foo.bar.MyProxy" />。但是我仍然遇到了问题:在类路径资源[test-context.xml]中定义的名为'proxy'的bean创建失败。 - luksmir
你能提供一下堆栈跟踪吗?另外,请提供您的源代码。 - Francisco Spaeth
成功了!不过,我必须稍微不同地定义这个bean:<bean id="proxy" class="foo.bar.MyFactoryBean" />。感谢您提供的提示。 - luksmir
你是对的,我刚刚纠正了xml上下文的类名。 - Francisco Spaeth

-1
在Spring中,你不使用提供者,而是将你的类MyProxy配置为一个原型。这可以通过使用@Component或@Service或其他一些类型的原型来注释该类来完成。并且启用组件扫描以扫描你的包,或者可以在applicationContext.xml中将其配置为原型。

问题在于MyProxy在外部的jar文件中,因此我无法对其进行注释。我将更新我的问题。 - luksmir
1
然后,您可以在applicationContext.xml中实例化它,将其创建为示例。 - oe.elvik
你可以在自己的代码中扩展MyProxy,然后进行自动装配。 - Thorbjørn Ravn Andersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接