如果缺少必要的豆子,春天肯定会抛出一个例外。它是否还可以在相反的场景中抛出异常,其中发现一个豆子但没有必要?
断续器:
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-based
setter-based
field-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” 作为结果。getDataFromService
DataCollector
beanName
现在,当 spring 查看上下文初始化期间的定义时,没有办法确定哪些 bean 依赖于。这完全取决于应用程序逻辑,以及调用方法时用于参数的值。DataController
DataCollector
beanName
getDataFromService
因此,弹簧无法确定是否存在从未使用的豆子(因为豆子的使用可以是动态的,如上例所示)。