getComponent的作用是得到依赖的其他对象信息,下面分析一下它的调用流程:
1、得到组件对应的注解信息:
S4PropWrapper s4PropWrapper = getProperty(name, S4Component.class);
S4Component s4Component = (S4Component) s4PropWrapper.getAnnotation();
Class<? extends Configurable> expectedType = s4Component.type();
2、propValues保存了组件的所有属性信息,因此先从propValues获取:
Object propVal = propValues.get(name);
3、如果已经存在propValues中,并且propVal是Configurable类型,直接返回:
if (propVal != null && propVal instanceof Configurable) {
return (Configurable) propVal;
}
4、如果propVal是String类型,则先得到组件的PropertySheet,然后调用PropertySheet的getOwner方法,进行反射来创建对象,同时保存到propVal中:
if (propVal != null && propVal instanceof String) {
PropertySheet ps = cm.getPropertySheet(flattenProp(name));
if (ps != null)
configurable = ps.getOwner();
else
throw new InternalConfigurationException(getInstanceName(), name, "component '" + flattenProp(name)
+ "' is missing");
}
if (configurable != null) {
propValues.put(name, configurable);
return configurable;
}
5、如果 configurable为null,则通过注解来创建,并保存到propValues中:
configurable = getComponentFromAnnotation(name, s4Component);
propValues.put(name, configurable);