IDEA安装spotbugs插件替代findbugs插件

2023-05-16

    相信最近想在IDEA上安装findbugs插件的朋友,遇到与我一样的问题,findbugs与IDEA不兼容:

    https://plugins.jetbrains.com/plugin/3847-findbugs-idea

    主要是FindBugs插件已经不更新了,它最新版本停留在2016年发布的1.0.1,仅往上支持idea2018,所以新版本的idea它无法兼容。

     这个插件其实是有需求的,但是不可能不能被安装,主要是它被SpotBugs取代了。我们打开idea设置面板,在插件市场,可以搜索spotbugs,就可以直接安装:

   安装完成,我们在项目或者目录下右键,就可以看到SpotBugs选项了:

    接下来就可以验证一下,我们在spring编程中,经常会见到这个代码:

/*
 *    xxx co.ltd Copyright @ 2023-2023 All Rights Reserved
 */

package com.example.util;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * 描述信息
 *
 * @author Administrator
 * @since 2023/4/4 23:06
 */
public class SpringUtil implements ApplicationContextAware, DisposableBean {
    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        if (applicationContext != null) {
            return applicationContext;
        }
        return null;
    }

    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtil.applicationContext = applicationContext;
    }

    @Override
    public void destroy() throws Exception {
        applicationContext = null;
    }
}

    这个代码是我们的一个spring工具类,它通过上下文信息直接获取bean实例。逻辑都没有任何问题。但是通过SpotBugs却检出了问题:

Write to static field from instance method 

 

    如果我们详细分析一下,这里,在实例方法里面给静态变量赋值, 如果在多线程环境中,有多个线程同时调用这个实例方法,确实有可能造成并发安全问题。

     但是,实际上,这两个实例方法setApplicationContext(),destroy()只会在SpringUtil创建和销毁的时候,调用一次,仅此一次,所以它并不会产生安全问题。

    这个问题的解决办法也很奇葩,这里是在实例方法(非静态方法)中给静态变量赋值,我们只需要套用一个静态方法就能解决。

public static void setContext(ApplicationContext applicationContext) {
	SpringUtil.applicationContext = applicationContext;
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
	// SpringUtil.applicationContext = applicationContext;
	setContext(applicationContext);
}

@Override
public void destroy() throws Exception {
	//applicationContext = null;
	setContext(null);
}

    运行截图:

 

    这个办法能解决这个问题,但是原理是什么我不清楚,非静态方法调用静态方法就可以解决共享变量安全问题,这办法好像很二,但是能骗过findbugs。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IDEA安装spotbugs插件替代findbugs插件 的相关文章

随机推荐

  • 数据库:group by 的使用

    一 概述 group by的意思是根据by对数据按照哪个字段进行分组 xff0c 或者是哪几个字段进行分组 二 语法 select 字段 from 表名 where 条件 group by 字段 或者 select 字段 from 表名 g
  • C++中 std::vector 的6种初始化方法

    1 vector lt int gt list1 默认初始化 xff0c 最常用 此时 xff0c vector为空 xff0c size为0 xff0c 表明容器中没有元素 xff0c 而且 capacity 也返回 0 xff0c 意味
  • MIMO雷达处理1

    参考文献 MIMO RADAR SIGNAL PROCESSING 以下为我自己的理解 xff0c 如有问题 xff0c 请指出 目录 初步分析虚拟阵列123 确认目标数 初步分析 MIMO radar与相控阵雷达区别在于MIMO中的各天线
  • AndroidStudio生成aar包和如何使用aar包

    我用的是android studio 2 0正式版 1 简介 aar包是Android studio下打包android工程中src res lib后生成的aar文件 xff0c aar包导入其他android studio 工程后 xff
  • C++智能指针详解:shared_ptr

    C 43 43 没有内存回收机制 xff0c 每次程序员new出来的对象需要手动delete xff0c 流程复杂时可能会漏掉delete xff0c 导致内存泄漏 于是C 43 43 引入智能指针 xff0c 可用于动态资源管理 xff0
  • C++算法题:关于树的算法

    问题1 xff1a 输入一棵二元查找树 xff0c 将该二元查找树转换成一个排序的双向链表 要求不能创建任何新的结点 xff0c 只调整指针的指向 什么是二元查找树 xff1f 比如 xff1a 转换成双向链表的顺序是 xff1a 1 3
  • C++算法题:递归和栈的算法

    问题1 xff1a 跳台阶问题 具体描述 xff0c 一个台阶总共有n级 xff0c 如果一次可以跳1级 xff0c 也可以跳2级 求总共有多少总跳法 xff0c 并分析算法的时间杂度 相当于从下往上跳 xff0c 最后剩一个 xff08
  • Linux的.service服务 实现程序开机自启

    一 service文件的位置 所有可用的单元文件存放在 lib systemd system 和 etc systemd system 目录 我们需要在 lib systemd system 下存放 service文件 xff0c 当sys
  • 计算机网络 复习提纲(完整版)

    第一章 概述 计算机网络 xff1a 利用通信线路和通信设备 xff0c 将地理位置和功能不同的多台计算机互联起来 xff0c 用完善的网络软件实现资源共享和信息传递的网络 组成 xff1a 计算机 xff0c 网络操作系统 xff0c 传
  • 无人机多任务寻径仿真软件与实验平台(一)

    项目背景 xff1a 近年来 xff0c 无人机的应用领域已经得到了极大的拓展 xff0c 旋翼无人机凭借较大的载荷 xff0c 稳定的飞行状态与对高空环境的高度适应 xff0c 成为了应用最为广泛的一类无人机 在欧洲 xff0c 北美洲等
  • 无人机实验平台(七) 实验平台的坐标转换(上)

    为什么要做坐标转换 xff1f 大疆提供的sdk中指出 xff0c 无人机通常情况下通过两个坐标系来控制方向 xff1a 自身坐标系 xff08 Body xff09 和地面坐标系 xff08 N E D xff09 这两个坐标系可以相互转
  • 无人机实验平台(十) 室内悬停问题

    VirtualStick Mode VirtualStick Mode是Sdk提供的一种底层控制模式 xff0c 通过模拟物理摇杆的运动向无人机按照一定频率发送摇杆差分信息 xff0c 使得无人机按照类似于被物理摇杆控制的方式运行 xff0
  • 第30章 ADC—电压采集—零死角玩转STM32-F429系列

    第30章 ADC 电压采集 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege 本章参考资料
  • 大数据安全考试提纲

    范围划得虽大 xff0c 但是主题不多 xff0c 和往常一样记录一下重点 考试范围 1 大数据安全概念及目标 2 传统访问控制技术和基于密码的访问控制技术 3 角色挖掘的算法 4 对称密码 xff0c 非对称密码 xff0c hash算法
  • 算法设计与分析(小总结)

    原先一直没注意这一门 xff0c 大概是因为学这些算法的时候 xff0c 板子都不知道背多少遍了 可是考试毕竟不一样 xff0c 如果来个证明很容易抓瞎 看了往年的试题 xff0c 可能确实因为难度高 xff0c 范围一缩再缩 xff0c
  • 软件测试技术

    引论 为什么进行软件测试 xff1f 软件存在缺陷 xff0c 只有通过测试才可以发现缺陷 xff0c 只有发现缺陷才能把缺陷从产品中清除出去 软件中缺陷带来的损失是巨大的 测试是所有工程学科的基本组成单元 软件测试 xff1a 验证 43
  • c语言自定义tcp协议实现socket通信(windows版本)

    前面一篇博客介绍了mac linux下通过C语言自定义协议实现socket通信的示例 xff0c 因为大部分api与windows还有很多区别 xff0c 这里就特意把windows下的tcp通信实例给介绍一下 无论是linux xff0c
  • opencv for java给图片添加水印中文问题

    opencv提供的给图片添加文字的方法Imgproc putText 可以给图片添加文字 xff0c 最后类似一个添加水印的效果 xff0c 但是这个方法对中文支持不好 xff0c 在没有字体支持的情况下 xff0c 默认中文显示 如下图所
  • 社区版Intellij IDEA安装Spring Boot Assistant插件解决yml无提示问题

    如题所示 xff0c 我们如果个人使用免费社区版的IDEA xff0c 它缺失了很多功能 xff0c 使用起来没有专业版那么强大 xff0c 比如无法直接创建springbootinit项目 xff0c spring配置yml文件没有提示
  • IDEA安装spotbugs插件替代findbugs插件

    相信最近想在IDEA上安装findbugs插件的朋友 xff0c 遇到与我一样的问题 xff0c findbugs与IDEA不兼容 xff1a https plugins jetbrains com plugin 3847 findbugs