Spring 的@RequestScope 是否在注入单例 bean 时自动处理代理?
Does Spring's @RequestScope automatically handle proxying when injected in singleton beans?
我正在使用 Java8/Spring Boot 2 应用程序。我想将一个请求范围的 bean 注入到一个单例 bean 中。 official documentation highlights that either a proxy or ObjectFactory/Provider should be used to ensure always getting the correctly scoped bean at runtime in the singleton bean. However, the @RequestScope annotation seems to "automatically" set some kind of proxy, as explained in the answer to .
我现在想知道以下三个实现是否实际上相同,哪个是首选?
方法 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,因为它简洁并且自动处理 scoping/proxying。
如果将我的@Autowired bean 声明为final
字段,答案会改变吗?我担心将其设置为 final 会以某种方式阻止代理在每次请求时正确获取新 bean。
我一直在我的项目中使用第二种方法,到目前为止我的问题为零。该文档没有提到它也必须使用 ObjectFactory
。不要想太多。如果您 运行 遇到任何问题,您会在控制台中非常清楚地看到错误。在您遇到实际问题需要处理之前,没有理由害怕。
是的,@RequestScope
代理已经默认激活,效果完全等同于@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyModel = ScopedProxyMode.TARGET_CLASS)
我正在使用 Java8/Spring Boot 2 应用程序。我想将一个请求范围的 bean 注入到一个单例 bean 中。 official documentation highlights that either a proxy or ObjectFactory/Provider should be used to ensure always getting the correctly scoped bean at runtime in the singleton bean. However, the @RequestScope annotation seems to "automatically" set some kind of proxy, as explained in the answer to
我现在想知道以下三个实现是否实际上相同,哪个是首选?
方法 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,因为它简洁并且自动处理 scoping/proxying。
如果将我的@Autowired bean 声明为final
字段,答案会改变吗?我担心将其设置为 final 会以某种方式阻止代理在每次请求时正确获取新 bean。
我一直在我的项目中使用第二种方法,到目前为止我的问题为零。该文档没有提到它也必须使用 ObjectFactory
。不要想太多。如果您 运行 遇到任何问题,您会在控制台中非常清楚地看到错误。在您遇到实际问题需要处理之前,没有理由害怕。
是的,@RequestScope
代理已经默认激活,效果完全等同于@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyModel = ScopedProxyMode.TARGET_CLASS)