将javax.inject.Provider与Spring@Scope(BeanDefinition.Scope\u原型)一起使用
有人能解释一下,将提供者和SCOPE_原型结合起来有意义吗。因为,每次SocketSender被注入时,我都会得到一个新的SocketSender对象,因为SCOPE_PROTOTYPE?把这两者结合起来似乎毫无意义。请参阅下面的代码。这两种实现在任何方面都有区别吗?提前谢谢将javax.inject.Provider与Spring@Scope(BeanDefinition.Scope\u原型)一起使用,java,spring,dependency-injection,inject,Java,Spring,Dependency Injection,Inject,有人能解释一下,将提供者和SCOPE_原型结合起来有意义吗。因为,每次SocketSender被注入时,我都会得到一个新的SocketSender对象,因为SCOPE_PROTOTYPE?把这两者结合起来似乎毫无意义。请参阅下面的代码。这两种实现在任何方面都有区别吗?提前谢谢 @Configuration public class SpringConfiguration { @Bean @Scope(BeanDefinition.SCOPE_PROTOTYPE) public So
@Configuration
public class SpringConfiguration {
@Bean
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public SocketSender getSender() {
return new SocketSender();
}
}
//First implementation
class MyServiceImpl{
private Provider<SocketSender> socketSender;
@Inject
public MyServiceImpl(Provider<SocketSender> socketSender){
this.socketSender=socketSender;
}
public void doSomething(){
socketSender.get().doAnotherThing();
}
}
//Second implementation
class MyServiceImpl{
private SocketSender socketSender;
@Inject
public MyServiceImpl(SocketSender socketSender){
this.socketSender=socketSender;
}
public void doSomething(){
socketSender.doAnotherThing();
}
}
@配置
公共类配置{
@豆子
@范围(BeanDefinition.Scope\u原型)
公共SocketSender getSender(){
返回新的SocketSender();
}
}
//首次实施
类MyServiceImpl{
私有提供者socketSender;
@注入
公共MyServiceImpl(提供程序socketSender){
this.socketSender=socketSender;
}
公共无效剂量测定法(){
socketSender.get().doNotherthing();
}
}
//第二次实施
类MyServiceImpl{
私人SocketSender SocketSender;
@注入
公共MyServiceImpl(SocketSender SocketSender){
this.socketSender=socketSender;
}
公共无效剂量测定法(){
socketSender.doNotherthing();
}
}
基本上这取决于您所做的,有时使用提供者是一个好选择,有时则不是
例如,如果您有一些类MyService
需要一个名为MyBuilder
的bean,它应该为foo
方法的每次调用创建(因为它在内部保存状态),那么使用MyBuilder
的原型范围和MyService
的单例范围是有意义的
如果我们使用简单的实现:
// singleton bean
class MyService {
// defined as a prototype in spring, but what about injection?
@Autowired
private MyBuilder myBuilder;
public void foo(int param) {
Product p = myBuilder.withParam(param).build();
...
}
}
如果不能按预期工作:将重用myBuilder
对象,它将始终是同一个对象。。。
之所以会发生这种情况,是因为Spring只在初始化singleton时将原型注入singleton一次,而且它的引用总是相同的
要解决此问题,您可以使用提供程序
:
class MyService {
private Provider<MyBuilder> myBuilder;
public void foo(int param) {
Product p = myBuilder.get().withParam(param).build();
...
}
}
classmyservice{
私人提供商myBuilder;
公共void foo(int参数){
产品p=myBuilder.get().withParam(param.build();
...
}
}
现在,每次调用Provider上的get
时,对foo
方法的不同调用都会处理myBuilder的不同实例(因此每次方法调用都会得到一个新实例)。如果不这样做,每次都会得到相同的实例。