当注入单例 bean 时,Spring 的 @RequestScope 是否会自动处理代理?

use*_*155 4 java spring-bean spring-boot requestscope

我正在使用 Java8/Spring Boot 2 应用程序。我想将请求范围的 bean 注入到单例 bean 中。在官方文件,要么代理或的ObjectFactory /供应商应使用亮点保证一直在单身豆获得正确范围的bean在运行时。但是,@RequestScope 注释似乎“自动”设置了某种代理,如此问题的答案中所述。

我现在想知道以下三个实现是否实际上相同,哪个更受欢迎?

方法 1:显式使用 objectFactory<>

@Component
@RequestScope
public class MyRequestScopedBean{...}

@Component
public class MySingletonBean{
    @Autowired
    private ObjectFactory<MyRequestScopedBean> myRequestScopedBean
}
Run Code Online (Sandbox Code Playgroud)

方法2:正常注入,假设请求范围的bean是自动代理的?

@Component
@RequestScope
public class MyRequestScopedBean{...}

@Component
public class MySingletonBean{
    @Autowired
    private MyRequestScopedBean myRequestScopedBean
}
Run Code Online (Sandbox Code Playgroud)

方法 3:使用 @Configuration 和 @Bean 因为我不知道它们的区别,而且我担心它们的行为不同。

@Comfiguration
public class myBeanConfig{
   @Bean
   @RequestScope
   public MyRequestScopedBean getRequestScopedBean(){return new MyRequestScopedBean();}

}

@Component
public class MySingletonBean{
    @Autowired
    private MyRequestScopedBean myRequestScopedBean
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢方法 2,因为它简洁并自动处理范围/代理。

如果我的@Autowired bean 被声明为一个final字段,答案会改变吗?我担心使其最终以某种方式阻止代理获取正确获取每个请求的新 bean。

Mr.*_*mes 5

我一直在我的项目中使用第二种方法,到目前为止我的问题为零。文档没有提到它也是必须使用的ObjectFactory。不要想太多。如果您遇到任何问题,您将在控制台中非常清楚地看到错误。在您有实际问题需要处理之前,没有理由害怕。