在覆盖 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(),会出现啥问题? [复制]

gitlab增量代码覆盖率

在 TypeScript 接口中覆盖/覆盖方法签名

带有两个指标的 pine 脚本,一个覆盖在图表上,另一个单独覆盖?

如何在代码覆盖率报告 Laravel 8 中覆盖异常?

为啥我的覆盖率报告显示红色覆盖线?