春天Guice提供者的等价性

luk*_*mir 4 java spring guice

Guice的提供者在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);
}
Run Code Online (Sandbox Code Playgroud)

}

这里定义了绑定:

public class MyModule implements Module {

@Override
public void configure(Binder g) {
    g.bind(MyProxy.class).toProvider(MyProxyProvider.class);
}
Run Code Online (Sandbox Code Playgroud)

}

最后,我的目标是使用@Autowired代理对象,如下所示:

public class ConnectionTest {

@Autowired
MyProxy proxy;
Run Code Online (Sandbox Code Playgroud)

}

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

Fra*_*eth 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

当您拥有外部库和复杂对象创建时,这是一种很好的方法,可以避免长XML配置来设置bean.

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

...
<bean id="myClass" class="foo.bar.MyFactoryBean" />
...
Run Code Online (Sandbox Code Playgroud)

但是,如果你的bean很容易被实例化(没有很多依赖项),你可以直接在上下文XML上设置它,如:

<bean id="myClass" class="foo.bar.MyClassImplementation" />
Run Code Online (Sandbox Code Playgroud)

替代

如果您使用Spring 3,您可以编写一个配置类(带注释的类@Configuration),如此处所述.通过这种方法,您可以执行以下操作:

@Configuration
public class MyConfiguration {

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

}
Run Code Online (Sandbox Code Playgroud)

这会将您的实例添加到spring上下文中,并让它在其他类中自动装配.但是需要一些配置,并且根据提供的文档很容易.