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;
}

另请注意,无法修改外部 jar 文件中的 MyProxy 类。

4

2 回答 2

6

相当于Providerguice的是FactoryBeanSpring中的。

从文档中:

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 时,这是一个好方法。

为了在您的上下文中使用它,您可以在您的上下文 XML 中将其作为普通 bean 提供,例如:

...
<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 上下文中,并让它在其他类中自动装配。但是需要一些配置,并且按照提供的文档很容易。

于 2013-05-08T06:05:43.100 回答
-1

您在 spring 中不使用提供程序,而是将您的类 MyProxy 配置为原型。这可以通过使用 @Component 或 @Service 或其他类型的构造型注释类来完成。并为您的包启用组件扫描,或者可以将其配置为 applicationContext.xml 中的构造型

于 2013-05-08T06:03:32.737 回答