我正在使用 Java8/Spring Boot 2 应用程序。我想将请求范围的 bean 注入单例 bean。官方文档强调应该使用代理或 ObjectFactory/Provider 来确保在运行时始终在单例 bean 中获取正确范围的 bean 。但是,@RequestScope 注释似乎“自动”设置了某种代理,正如对这个问题的回答中所解释的那样。
我现在想知道以下三种实现是否实际上相同,并且首选哪一种?
方法 1:显式使用 objectFactory<>
@Component
@RequestScope
public class MyRequestScopedBean{...}
@Component
public class MySingletonBean{
@Autowired
private ObjectFactory<MyRequestScopedBean> myRequestScopedBean
}
方法2:正常注入,假设请求范围的bean是自动代理的?
@Component
@RequestScope
public class MyRequestScopedBean{...}
@Component
public class MySingletonBean{
@Autowired
private MyRequestScopedBean myRequestScopedBean
}
方法 3:使用 @Configuration 和 @Bean 因为我不知道它们的区别,而且我担心它们的行为会有所不同。
@Comfiguration
public class myBeanConfig{
@Bean
@RequestScope
public MyRequestScopedBean getRequestScopedBean(){return new MyRequestScopedBean();}
}
@Component
public class MySingletonBean{
@Autowired
private MyRequestScopedBean myRequestScopedBean
}
我更喜欢方法 2,因为它简洁并自动处理范围/代理。
如果我的@Autowired bean 被声明为一个final
字段,答案会改变吗?我担心让它最终以某种方式阻止代理获取正确获取每个请求的新bean。