检测未使用的春豆



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

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

  • http://forum.spring.io/forum/spring-projects/container/116494-any-tools-or-method-to-identify-unused-spring-beans
  • 春季实例化和"未使用的豆子"
  • 如何检测春季未使用的属性

然而

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

如果缺少必要的豆子,春天肯定会抛出一个例外。在找到 bean 但不必要的相反情况下,它是否也可以引发异常?

春天肯定会抛出一个例外,如果一个必要的豆子是 失踪。在相反的情况下,它是否也可以抛出异常,其中 发现了豆子,但没有必要?

TL/DR:

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

长版本:

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

首先,让我们定义春天何时抛出"丢失的豆子"异常。

在 spring 上下文的初始化期间,spring 按照允许满足所有依赖项的顺序创建 bean(如果可能)。如果一个 bean 缺少依赖项,Spring 将抛出一个异常(正如你所说)。因此,在 spring 上下文初始化过程中会抛出异常。

现在,您可以说我们可以监视此过程,并查找未在任何其他 Bean 中用作依赖项的 bean。问题在于,并非所有的 Bean 依赖项都是在 spring 上下文初始化过程中定义的。

让我们看下面的例子:

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

public interface DataService {
 String getData();
}

现在我们有 2 个实现此接口的 Spring bean:

@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 中。

现在,考虑以下 bean:

@Service
public class DataCollector {
  @Autowired
  ApplicationContext applicationContext;

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

如果我使用 beanName 参数的"firstDataService"值调用 DataCollector Bean 的 getDataFromService 方法,该方法将返回"FIRST DATA SERVICE"。如果我使用"secondDataService"调用该方法,我将返回"SECOND DATA SERVICE"。

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

正因为如此,Spring 无法确定是否有从未使用的 bean(因为 bean 的使用可能是动态的,就像上面的情况一样)。

相关内容

  • 没有找到相关文章

最新更新