给定一个只包含急切(非懒惰)单例 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-based
、setter-based
或field-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 的使用可能是动态的,就像上面的情况一样)。