Bean的依赖检查
应用复杂——> IOC管理的Bean非常多——>依赖关系复杂——>一般情况下是在应用第一次向容器索取Bean的时候发生[这个过程不能保证注入一定能成功]——>如果需要重新检查这些依赖关系的有效性,会是一件很繁琐的事情——>Spring设计了一个依赖检查特性,通过它可以帮助应用检查是否所有的属性都已经被正确设置。——>在Bean定义中设置dependency-check属性来滴定依赖检查模式(none、simple、object、all四种模式),默认是none,具体的实现在AbstractAutowireCapableBeanFactory中的populateBean方法中的checkDependencies方法。会对Bean的Dependencies属性进行检查,如果发现不满足要求,就会抛出异常通知应用。
protected void checkDependencies(
String beanName, AbstractBeanDefinition mbd, PropertyDescriptor[] pds, @Nullable PropertyValues pvs)
throws UnsatisfiedDependencyException {
int dependencyCheck = mbd.getDependencyCheck();
for (PropertyDescriptor pd : pds) {
if (pd.getWriteMethod() != null && (pvs == null || !pvs.contains(pd.getName()))) {
boolean isSimple = BeanUtils.isSimpleProperty(pd.getPropertyType());
boolean unsatisfied = (dependencyCheck == AbstractBeanDefinition.DEPENDENCY_CHECK_ALL) ||
(isSimple && dependencyCheck == AbstractBeanDefinition.DEPENDENCY_CHECK_SIMPLE) ||
(!isSimple && dependencyCheck == AbstractBeanDefinition.DEPENDENCY_CHECK_OBJECTS);
if (unsatisfied) {
throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, pd.getName(),
"Set this property value or disable dependency checking for this bean.");
}
}
}
}