检测未使用的春豆

2022-09-02 22:39:40

给定一个只包含急切(非懒惰)单例bean的Spring配置,即默认值,如果这些bean中的任何一个没有注入任何地方,是否有可能让Spring抛出一个异常?我基本上正在寻找一种方法来检测Spring Bean形式的死代码。

我的问题与这些有些相似。

然而

  • 我对手动检查图形或解析日志数据不感兴趣。
  • 我没有增加多个上下文文件的复杂性,覆盖bean,Bean后处理或xml。这是一个简单、直接、注释驱动的配置。
  • 我正在使用Spring Boot 1.2.6,它比这些问题更新了几年(也许存在新功能)。

如果缺少必要的豆子,春天肯定会抛出一个例外。它是否还可以在相反的场景中抛出异常,其中发现一个豆子但没有必要?


答案 1

如果缺少必要的豆子,春天肯定会抛出一个例外。它是否还可以在相反的场景中抛出异常,其中发现一个豆子但没有必要?

断续器

Spring不支持这一点(可能永远不会)。

长版本:

检测是否使用了豆子可能非常困难。

首先,让我们定义春天什么时候会抛出“缺失的豆子”异常。

在 spring 上下文的初始化期间,spring 会按照它允许满足所有依赖关系的顺序创建 bean(如果可能)。如果一个豆子缺少依赖关系,spring会抛出一个异常(如你所说)。因此,在弹簧上下文初始化过程中会引发异常。

现在,你可以说我们可以监视这个过程,并寻找一个在任何其他bean中不用作依赖项的bean。问题在于,并非所有的 Bean 依赖关系都是在 spring 上下文初始化过程中定义的。

让我们看一下下面的例子:

首先,我们有一个简单的界面,DataService

public interface DataService {
 String getData();
}

现在我们有 2 个实现此接口的弹簧豆:

@Service("firstDataService")
public class FirstDataService implements DataService {

  @Override
  public String getData() {
    return "FIRST DATA SERVICE";
  }
}

@Service("secondDataService")
public class SecondDataService implements DataService {
  @Override
  public String getData() {
    return "SECOND DATA SERVICE";
  }
}

现在,想象一下,没有直接依赖这两种豆子的豆子。当我直接说时,我的意思是没有豆子通过,或依赖注入来依赖这些豆子。constructor-basedsetter-basedfield-based

因此,在上下文初始化过程中,spring不会将这些bean注入任何其他bean中。

现在,考虑以下豆类:

@Service
public class DataCollector {

  @Autowired
  ApplicationContext applicationContext;


  String getDataFromService(String beanName) {
    DataService ds = (DataService) applicationContext.getBean(beanName);
    return ds.getData();
  }
}

如果我使用参数的“firstDataService”值调用bean的方法,则该方法将返回“FIRST DATA SERVICE”作为结果。如果我使用“secondDataService”调用该方法,我将返回“second Data Service” 作为结果。getDataFromServiceDataCollectorbeanName

现在,当 spring 查看上下文初始化期间的定义时,没有办法确定哪些 bean 依赖于。这完全取决于应用程序逻辑,以及调用方法时用于参数的值。DataControllerDataCollectorbeanNamegetDataFromService

因此,弹簧无法确定是否存在从未使用的豆子(因为豆子的使用可以是动态的,如上例所示)。


答案 2

推荐