有人可以解释一下,将Provider与SCOPE_PROTOTYPE结合起来有意义吗?因为,每次注入SocketSender都会由于SCOPE_PROTOTYPE而获得一个新的SocketSender对象?似乎将两者结合起来毫无意义。请参见下面的代码。这两种实现之间有什么区别吗?提前致谢。@Configurationpublic class SpringConfiguration { @Bean @Scope(BeanDefinition.SCOPE_PROTOTYPE) public SocketSender getSender() { return new SocketSender(); }}//First implementationclass MyServiceImpl{ private Provider<SocketSender> socketSender; @Inject public MyServiceImpl(Provider<SocketSender> socketSender){ this.socketSender=socketSender; } public void doSomething(){ socketSender.get().doAnotherThing(); }}//Second implementationclass MyServiceImpl{private SocketSender socketSender;@Injectpublic MyServiceImpl(SocketSender socketSender){ this.socketSender=socketSender;} public void doSomething(){ socketSender.doAnotherThing(); }} 最佳答案 基本上,这取决于您的内容,有时使用Provider是一个不错的选择,有时却不是。例如,如果您有某个类MyService需要一个名为的bean,则应为MyBuilder方法的每次调用创建一个foo(因为它在内部保持状态),那么将原型作用域用于和MyBuilder的单例作用域。如果我们使用简单的实现:// singleton beanclass 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(); ... }}如果不能按预期工作:MyService对象将被重用,它将始终是同一对象...之所以会发生这种情况,是因为在初始化单例时,Spring仅将原型注入到单例一次,并且因为它始终是相同的引用。为了解决这个问题,您可以使用myBuilder:class MyService { private Provider<MyBuilder> myBuilder; public void foo(int param) { Product p = myBuilder.get().withParam(param).build(); ... }}现在,不同的Provider方法调用将与不同的foo实例一起使用。关于java - 在Spring @Scope(BeanDefinition.SCOPE_PROTOTYPE)中使用java javax.inject.Provider,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59243400/
10-10 16:31