在覆盖 ApplicationContextAware.setApplicationContext 方法中初始化的变量是不是需要在 Spring Framework 中声明为 volatile?
Posted
技术标签:
【中文标题】在覆盖 ApplicationContextAware.setApplicationContext 方法中初始化的变量是不是需要在 Spring Framework 中声明为 volatile?【英文标题】:Do variables initialized in the override ApplicationContextAware.setApplicationContext method need to be declared as volatile in Spring Framework?在覆盖 ApplicationContextAware.setApplicationContext 方法中初始化的变量是否需要在 Spring Framework 中声明为 volatile? 【发布时间】:2021-12-10 06:14:36 【问题描述】:我通过重写 ApplicationContextAware.setApplicationContext 方法初始化 SpringUtils 类 Spring 单例 bean applicationContext 字段:
@Component
public class SpringUtils implements ApplicationContextAware
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
this.applicationContext = applicationContext;
/**
* get applicationContext
*
* @return ApplicationContext
*/
public ApplicationContext getApplicationContext()
return applicationContext;
我是否应该担心 SpringUtils 类 Spring 单例 bean applicationContext 字段对其他 bean(其他线程)的可见性并将其标记为 volatile。
【问题讨论】:
【参考方案1】:由于您有一个实际检索ApplicationContext
的getter 方法,因此任何其他可以访问SpringUtils
(通过依赖注入)的Spring 管理的Bean 都可以通过SpringUtils
访问ApplicationContext
,但任何其他Spring -managed Bean 也可以自己持有ApplicationContext
,所以我想说你只是想多了。
【讨论】:
但是有时候在setApplicationContext中初始化了一个bean map(private Map beanMap,not declare as volatile),这个beanMap是安全发布的吗?其他Spring管理的bean访问beanMap可以看到最新的值而不是陈旧的null ? 是的,ApplicationContext
是一个活物。你会“看到”它的变化。以上是关于在覆盖 ApplicationContextAware.setApplicationContext 方法中初始化的变量是不是需要在 Spring Framework 中声明为 volatile?的主要内容,如果未能解决你的问题,请参考以下文章
如果在覆盖 Equals() 时未能覆盖 GetHashCode(),会出现啥问题? [复制]